<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>rest-api Archives - WP-CLI Mastery</title>
	<atom:link href="https://wpclimastery.com/blog/tag/rest-api/feed/" rel="self" type="application/rss+xml" />
	<link>https://wpclimastery.com/blog/tag/rest-api/</link>
	<description>Automate WordPress Like a DevOps Pro.</description>
	<lastBuildDate>Mon, 24 Nov 2025 11:16:47 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://wpclimastery.com/wp-content/uploads/2025/11/cropped-favicon-32x32.webp</url>
	<title>rest-api Archives - WP-CLI Mastery</title>
	<link>https://wpclimastery.com/blog/tag/rest-api/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Bulletproof Error Handling in Bash Scripts for WP-CLI (Complete Guide)</title>
		<link>https://wpclimastery.com/blog/bulletproof-error-handling-in-bash-scripts-for-wp-cli-complete-guide/</link>
		
		<dc:creator><![CDATA[Krasen]]></dc:creator>
		<pubDate>Fri, 05 Dec 2025 09:00:00 +0000</pubDate>
				<category><![CDATA[Bash Scripting for WordPress]]></category>
		<category><![CDATA[plugin-test]]></category>
		<category><![CDATA[rest-api]]></category>
		<category><![CDATA[yoast-seo]]></category>
		<guid isPermaLink="false">https://wpclimastery.com/?p=136</guid>

					<description><![CDATA[<p>Your WordPress automation script runs perfectly 99% of the time. Then one day it silently fails during a database import, deletes files you meant to keep, or corrupts data because...</p>
<p>The post <a href="https://wpclimastery.com/blog/bulletproof-error-handling-in-bash-scripts-for-wp-cli-complete-guide/">Bulletproof Error Handling in Bash Scripts for WP-CLI (Complete Guide)</a> appeared first on <a href="https://wpclimastery.com">WP-CLI Mastery</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Your WordPress automation script runs perfectly 99% of the time. Then one day it silently fails during a database import, deletes files you meant to keep, or corrupts data because a command returned an error you never checked. Production is down.</p>
<p>Bash scripts without proper error handling are disasters waiting to happen. One unchecked exit code, one missing validation, and your automation becomes your biggest liability instead of your greatest asset.</p>
<p>In this guide, you’ll learn professional error handling techniques that prevent script failures, protect your data, and make WP-CLI automation scripts production-ready and bulletproof.</p>
<h3 id="why-error-handling">Why Error Handling Matters for WP-CLI Scripts</h3>
<p><a href="https://www.gnu.org/software/bash/manual/">Bash scripting</a> by default continues executing after errors occur, which is dangerous for WordPress operations.</p>
<h4 id="problems-with-poor-error-handling">Problems with Poor Error Handling</h4>
<p><strong>Silent failures</strong>: Scripts continue after failed database exports, creating incomplete backups.</p>
<p><strong>Data corruption</strong>: Import scripts run on wrong databases because connection checks were skipped.</p>
<p><strong>Partial operations</strong>: Plugin updates fail halfway through, leaving sites in broken states.</p>
<p><strong>No recovery</strong>: Scripts can’t rollback or cleanup after failures.</p>
<p><strong>Debugging nightmares</strong>: No logs or error messages make troubleshooting impossible.</p>
<h4 id="professional-error-handling-benefits">Professional Error Handling Benefits</h4>
<p><strong>Early failure detection</strong>: Scripts stop immediately when errors occur.</p>
<p><strong>Safe operations</strong>: Validate inputs and check preconditions before making changes.</p>
<p><strong>Automatic cleanup</strong>: Trap errors and perform cleanup even during failures.</p>
<p><strong>Detailed logging</strong>: Track exactly what failed and why for quick debugging.</p>
<p><strong>Production-ready</strong>: Confidence to run scripts on live sites without supervision.</p>
<p>According to <a href="https://puppet.com/resources/report/state-of-devops-report/">DevOps research</a>, organizations with robust error handling in automation scripts experience 60% fewer outages.</p>
<h3 id="fundamentals">Bash Error Handling Fundamentals</h3>
<p>Master the core error handling mechanisms in Bash.</p>
<h4 id="exit-codes-and-variable">Exit Codes and $? Variable</h4>
<div class="sourceCode" id="cb1">
<pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true"></a><span class="co"># Every command returns exit code</span></span>
<span id="cb1-2"><a href="#cb1-2" aria-hidden="true"></a><span class="co"># 0 = success, non-zero = failure</span></span>
<span id="cb1-3"><a href="#cb1-3" aria-hidden="true"></a></span>
<span id="cb1-4"><a href="#cb1-4" aria-hidden="true"></a><span class="ex">wp</span> core version</span>
<span id="cb1-5"><a href="#cb1-5" aria-hidden="true"></a><span class="bu">echo</span> <span class="va">$?</span>  # Prints 0 if successful</span>
<span id="cb1-6"><a href="#cb1-6" aria-hidden="true"></a></span>
<span id="cb1-7"><a href="#cb1-7" aria-hidden="true"></a><span class="ex">wp</span> plugin install nonexistent-plugin</span>
<span id="cb1-8"><a href="#cb1-8" aria-hidden="true"></a><span class="bu">echo</span> <span class="va">$?</span>  # Prints non-zero (1) <span class="kw">if</span> <span class="ex">failed</span></span>
<span id="cb1-9"><a href="#cb1-9" aria-hidden="true"></a></span>
<span id="cb1-10"><a href="#cb1-10" aria-hidden="true"></a><span class="co"># Check exit code immediately</span></span>
<span id="cb1-11"><a href="#cb1-11" aria-hidden="true"></a><span class="kw">if</span><span class="bu"> [</span> <span class="va">$?</span> <span class="ot">-eq</span> 0<span class="bu"> ]</span>; <span class="kw">then</span></span>
<span id="cb1-12"><a href="#cb1-12" aria-hidden="true"></a>    <span class="bu">echo</span> <span class="st">&quot;Success&quot;</span></span>
<span id="cb1-13"><a href="#cb1-13" aria-hidden="true"></a><span class="kw">else</span></span>
<span id="cb1-14"><a href="#cb1-14" aria-hidden="true"></a>    <span class="bu">echo</span> <span class="st">&quot;Failed&quot;</span></span>
<span id="cb1-15"><a href="#cb1-15" aria-hidden="true"></a><span class="kw">fi</span></span></code></pre>
</div>
<h4 id="better-check-exit-codes-inline">Better: Check Exit Codes Inline</h4>
<div class="sourceCode" id="cb2">
<pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true"></a><span class="co"># Check command directly in if statement</span></span>
<span id="cb2-2"><a href="#cb2-2" aria-hidden="true"></a><span class="kw">if</span> <span class="ex">wp</span> core is-installed<span class="kw">;</span> <span class="kw">then</span></span>
<span id="cb2-3"><a href="#cb2-3" aria-hidden="true"></a>    <span class="bu">echo</span> <span class="st">&quot;WordPress is installed&quot;</span></span>
<span id="cb2-4"><a href="#cb2-4" aria-hidden="true"></a><span class="kw">else</span></span>
<span id="cb2-5"><a href="#cb2-5" aria-hidden="true"></a>    <span class="bu">echo</span> <span class="st">&quot;WordPress not found&quot;</span></span>
<span id="cb2-6"><a href="#cb2-6" aria-hidden="true"></a>    <span class="bu">exit</span> 1</span>
<span id="cb2-7"><a href="#cb2-7" aria-hidden="true"></a><span class="kw">fi</span></span>
<span id="cb2-8"><a href="#cb2-8" aria-hidden="true"></a></span>
<span id="cb2-9"><a href="#cb2-9" aria-hidden="true"></a><span class="co"># Using &amp;&amp; for success chaining</span></span>
<span id="cb2-10"><a href="#cb2-10" aria-hidden="true"></a><span class="ex">wp</span> db export backup.sql <span class="kw">&amp;&amp;</span> <span class="bu">echo</span> <span class="st">&quot;Backup successful&quot;</span></span>
<span id="cb2-11"><a href="#cb2-11" aria-hidden="true"></a></span>
<span id="cb2-12"><a href="#cb2-12" aria-hidden="true"></a><span class="co"># Using || for failure handling</span></span>
<span id="cb2-13"><a href="#cb2-13" aria-hidden="true"></a><span class="ex">wp</span> db export backup.sql <span class="kw">||</span> <span class="kw">{</span> <span class="bu">echo</span> <span class="st">&quot;Backup failed!&quot;</span><span class="kw">;</span> <span class="bu">exit</span> 1<span class="kw">;</span> <span class="kw">}</span></span></code></pre>
</div>
<p><strong>Pro Tip</strong>: Always check exit codes for destructive operations like database imports, file deletions, or updates.</p>
<h4 id="set-error-handling-mode">Set Error Handling Mode</h4>
<div class="sourceCode" id="cb3">
<pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb3-1"><a href="#cb3-1" aria-hidden="true"></a><span class="co">#!/bin/bash</span></span>
<span id="cb3-2"><a href="#cb3-2" aria-hidden="true"></a></span>
<span id="cb3-3"><a href="#cb3-3" aria-hidden="true"></a><span class="co"># Exit on any error</span></span>
<span id="cb3-4"><a href="#cb3-4" aria-hidden="true"></a><span class="kw">set</span> <span class="ex">-e</span></span>
<span id="cb3-5"><a href="#cb3-5" aria-hidden="true"></a></span>
<span id="cb3-6"><a href="#cb3-6" aria-hidden="true"></a><span class="co"># Exit on undefined variables</span></span>
<span id="cb3-7"><a href="#cb3-7" aria-hidden="true"></a><span class="kw">set</span> <span class="ex">-u</span></span>
<span id="cb3-8"><a href="#cb3-8" aria-hidden="true"></a></span>
<span id="cb3-9"><a href="#cb3-9" aria-hidden="true"></a><span class="co"># Pipe failures cause script failure</span></span>
<span id="cb3-10"><a href="#cb3-10" aria-hidden="true"></a><span class="kw">set</span> <span class="ex">-o</span> pipefail</span>
<span id="cb3-11"><a href="#cb3-11" aria-hidden="true"></a></span>
<span id="cb3-12"><a href="#cb3-12" aria-hidden="true"></a><span class="co"># Combined (recommended)</span></span>
<span id="cb3-13"><a href="#cb3-13" aria-hidden="true"></a><span class="kw">set</span> <span class="ex">-euo</span> pipefail</span>
<span id="cb3-14"><a href="#cb3-14" aria-hidden="true"></a></span>
<span id="cb3-15"><a href="#cb3-15" aria-hidden="true"></a><span class="co"># Now script exits automatically on errors</span></span>
<span id="cb3-16"><a href="#cb3-16" aria-hidden="true"></a><span class="ex">wp</span> db export backup.sql  # Script exits if this fails</span>
<span id="cb3-17"><a href="#cb3-17" aria-hidden="true"></a><span class="ex">wp</span> plugin update --all    # Never runs if above failed</span></code></pre>
</div>
<p>Learn more about <a href="https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html">Bash set options</a>.</p>
<h3 id="validation">Validation and Precondition Checking</h3>
<p>Verify assumptions before executing dangerous operations.</p>
<h4 id="check-file-existence">Check File Existence</h4>
<div class="sourceCode" id="cb4">
<pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb4-1"><a href="#cb4-1" aria-hidden="true"></a><span class="co">#!/bin/bash</span></span>
<span id="cb4-2"><a href="#cb4-2" aria-hidden="true"></a><span class="kw">set</span> <span class="ex">-euo</span> pipefail</span>
<span id="cb4-3"><a href="#cb4-3" aria-hidden="true"></a></span>
<span id="cb4-4"><a href="#cb4-4" aria-hidden="true"></a><span class="va">BACKUP_FILE=</span><span class="st">&quot;/backups/database.sql.gz&quot;</span></span>
<span id="cb4-5"><a href="#cb4-5" aria-hidden="true"></a></span>
<span id="cb4-6"><a href="#cb4-6" aria-hidden="true"></a><span class="co"># Check file exists before import</span></span>
<span id="cb4-7"><a href="#cb4-7" aria-hidden="true"></a><span class="kw">if</span><span class="bu"> [</span> <span class="ot">!</span> <span class="ot">-f</span> <span class="st">&quot;</span><span class="va">$BACKUP_FILE</span><span class="st">&quot;</span><span class="bu"> ]</span>; <span class="kw">then</span></span>
<span id="cb4-8"><a href="#cb4-8" aria-hidden="true"></a>    <span class="bu">echo</span> <span class="st">&quot;Error: Backup file not found: </span><span class="va">$BACKUP_FILE</span><span class="st">&quot;</span></span>
<span id="cb4-9"><a href="#cb4-9" aria-hidden="true"></a>    <span class="bu">exit</span> 1</span>
<span id="cb4-10"><a href="#cb4-10" aria-hidden="true"></a><span class="kw">fi</span></span>
<span id="cb4-11"><a href="#cb4-11" aria-hidden="true"></a></span>
<span id="cb4-12"><a href="#cb4-12" aria-hidden="true"></a><span class="co"># Verify file size (not empty)</span></span>
<span id="cb4-13"><a href="#cb4-13" aria-hidden="true"></a><span class="va">FILE_SIZE=$(</span><span class="fu">stat</span> -c%s <span class="st">&quot;</span><span class="va">$BACKUP_FILE</span><span class="st">&quot;</span><span class="va">)</span></span>
<span id="cb4-14"><a href="#cb4-14" aria-hidden="true"></a><span class="kw">if</span><span class="bu"> [</span> <span class="st">&quot;</span><span class="va">$FILE_SIZE</span><span class="st">&quot;</span> <span class="ot">-lt</span> 1000<span class="bu"> ]</span>; <span class="kw">then</span></span>
<span id="cb4-15"><a href="#cb4-15" aria-hidden="true"></a>    <span class="bu">echo</span> <span class="st">&quot;Error: Backup file too small (</span><span class="va">${FILE_SIZE}</span><span class="st"> bytes), may be corrupted&quot;</span></span>
<span id="cb4-16"><a href="#cb4-16" aria-hidden="true"></a>    <span class="bu">exit</span> 1</span>
<span id="cb4-17"><a href="#cb4-17" aria-hidden="true"></a><span class="kw">fi</span></span>
<span id="cb4-18"><a href="#cb4-18" aria-hidden="true"></a></span>
<span id="cb4-19"><a href="#cb4-19" aria-hidden="true"></a><span class="co"># Safe to import</span></span>
<span id="cb4-20"><a href="#cb4-20" aria-hidden="true"></a><span class="ex">wp</span> db import <span class="st">&quot;</span><span class="va">$BACKUP_FILE</span><span class="st">&quot;</span></span></code></pre>
</div>
<h4 id="validate-wordpress-installation">Validate WordPress Installation</h4>
<div class="sourceCode" id="cb5">
<pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb5-1"><a href="#cb5-1" aria-hidden="true"></a><span class="co">#!/bin/bash</span></span>
<span id="cb5-2"><a href="#cb5-2" aria-hidden="true"></a><span class="kw">set</span> <span class="ex">-euo</span> pipefail</span>
<span id="cb5-3"><a href="#cb5-3" aria-hidden="true"></a></span>
<span id="cb5-4"><a href="#cb5-4" aria-hidden="true"></a><span class="co"># Check WordPress is installed</span></span>
<span id="cb5-5"><a href="#cb5-5" aria-hidden="true"></a><span class="kw">if</span> ! <span class="ex">wp</span> core is-installed <span class="op">2&gt;</span>/dev/null<span class="kw">;</span> <span class="kw">then</span></span>
<span id="cb5-6"><a href="#cb5-6" aria-hidden="true"></a>    <span class="bu">echo</span> <span class="st">&quot;Error: WordPress not installed in current directory&quot;</span></span>
<span id="cb5-7"><a href="#cb5-7" aria-hidden="true"></a>    <span class="bu">exit</span> 1</span>
<span id="cb5-8"><a href="#cb5-8" aria-hidden="true"></a><span class="kw">fi</span></span>
<span id="cb5-9"><a href="#cb5-9" aria-hidden="true"></a></span>
<span id="cb5-10"><a href="#cb5-10" aria-hidden="true"></a><span class="co"># Check database connection</span></span>
<span id="cb5-11"><a href="#cb5-11" aria-hidden="true"></a><span class="kw">if</span> ! <span class="ex">wp</span> db check <span class="op">2&gt;</span>/dev/null<span class="kw">;</span> <span class="kw">then</span></span>
<span id="cb5-12"><a href="#cb5-12" aria-hidden="true"></a>    <span class="bu">echo</span> <span class="st">&quot;Error: Database connection failed&quot;</span></span>
<span id="cb5-13"><a href="#cb5-13" aria-hidden="true"></a>    <span class="bu">exit</span> 1</span>
<span id="cb5-14"><a href="#cb5-14" aria-hidden="true"></a><span class="kw">fi</span></span>
<span id="cb5-15"><a href="#cb5-15" aria-hidden="true"></a></span>
<span id="cb5-16"><a href="#cb5-16" aria-hidden="true"></a><span class="bu">echo</span> <span class="st">&quot;✓ WordPress installation validated&quot;</span></span></code></pre>
</div>
<h4 id="check-required-commands-exist">Check Required Commands Exist</h4>
<div class="sourceCode" id="cb6">
<pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb6-1"><a href="#cb6-1" aria-hidden="true"></a><span class="co">#!/bin/bash</span></span>
<span id="cb6-2"><a href="#cb6-2" aria-hidden="true"></a><span class="kw">set</span> <span class="ex">-euo</span> pipefail</span>
<span id="cb6-3"><a href="#cb6-3" aria-hidden="true"></a></span>
<span id="cb6-4"><a href="#cb6-4" aria-hidden="true"></a><span class="co"># Function to check command availability</span></span>
<span id="cb6-5"><a href="#cb6-5" aria-hidden="true"></a><span class="fu">check_command()</span> <span class="kw">{</span></span>
<span id="cb6-6"><a href="#cb6-6" aria-hidden="true"></a>    <span class="kw">if</span> ! <span class="bu">command</span> -v <span class="st">&quot;</span><span class="va">$1</span><span class="st">&quot;</span> <span class="op">&amp;&gt;</span> /dev/null<span class="kw">;</span> <span class="kw">then</span></span>
<span id="cb6-7"><a href="#cb6-7" aria-hidden="true"></a>        <span class="bu">echo</span> <span class="st">&quot;Error: Required command &#39;</span><span class="va">$1</span><span class="st">&#39; not found&quot;</span></span>
<span id="cb6-8"><a href="#cb6-8" aria-hidden="true"></a>        <span class="bu">echo</span> <span class="st">&quot;Install it with: apt-get install </span><span class="va">$1</span><span class="st">&quot;</span></span>
<span id="cb6-9"><a href="#cb6-9" aria-hidden="true"></a>        <span class="bu">exit</span> 1</span>
<span id="cb6-10"><a href="#cb6-10" aria-hidden="true"></a>    <span class="kw">fi</span></span>
<span id="cb6-11"><a href="#cb6-11" aria-hidden="true"></a><span class="kw">}</span></span>
<span id="cb6-12"><a href="#cb6-12" aria-hidden="true"></a></span>
<span id="cb6-13"><a href="#cb6-13" aria-hidden="true"></a><span class="co"># Verify dependencies</span></span>
<span id="cb6-14"><a href="#cb6-14" aria-hidden="true"></a><span class="ex">check_command</span> wp</span>
<span id="cb6-15"><a href="#cb6-15" aria-hidden="true"></a><span class="ex">check_command</span> mysql</span>
<span id="cb6-16"><a href="#cb6-16" aria-hidden="true"></a><span class="ex">check_command</span> gzip</span>
<span id="cb6-17"><a href="#cb6-17" aria-hidden="true"></a></span>
<span id="cb6-18"><a href="#cb6-18" aria-hidden="true"></a><span class="bu">echo</span> <span class="st">&quot;✓ All required commands available&quot;</span></span></code></pre>
</div>
<h3 id="error-trapping">Error Trapping and Cleanup</h3>
<p>Handle errors gracefully and cleanup resources even during failures.</p>
<h4 id="basic-trap-command">Basic Trap Command</h4>
<div class="sourceCode" id="cb7">
<pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb7-1"><a href="#cb7-1" aria-hidden="true"></a><span class="co">#!/bin/bash</span></span>
<span id="cb7-2"><a href="#cb7-2" aria-hidden="true"></a><span class="kw">set</span> <span class="ex">-euo</span> pipefail</span>
<span id="cb7-3"><a href="#cb7-3" aria-hidden="true"></a></span>
<span id="cb7-4"><a href="#cb7-4" aria-hidden="true"></a><span class="co"># Cleanup function</span></span>
<span id="cb7-5"><a href="#cb7-5" aria-hidden="true"></a><span class="fu">cleanup()</span> <span class="kw">{</span></span>
<span id="cb7-6"><a href="#cb7-6" aria-hidden="true"></a>    <span class="bu">echo</span> <span class="st">&quot;Cleaning up temporary files...&quot;</span></span>
<span id="cb7-7"><a href="#cb7-7" aria-hidden="true"></a>    <span class="fu">rm</span> -f /tmp/temp-backup-*.sql</span>
<span id="cb7-8"><a href="#cb7-8" aria-hidden="true"></a>    <span class="bu">echo</span> <span class="st">&quot;Cleanup complete&quot;</span></span>
<span id="cb7-9"><a href="#cb7-9" aria-hidden="true"></a><span class="kw">}</span></span>
<span id="cb7-10"><a href="#cb7-10" aria-hidden="true"></a></span>
<span id="cb7-11"><a href="#cb7-11" aria-hidden="true"></a><span class="co"># Register cleanup to run on exit</span></span>
<span id="cb7-12"><a href="#cb7-12" aria-hidden="true"></a><span class="bu">trap</span> cleanup EXIT</span>
<span id="cb7-13"><a href="#cb7-13" aria-hidden="true"></a></span>
<span id="cb7-14"><a href="#cb7-14" aria-hidden="true"></a><span class="co"># Script continues normally</span></span>
<span id="cb7-15"><a href="#cb7-15" aria-hidden="true"></a><span class="bu">echo</span> <span class="st">&quot;Starting backup...&quot;</span></span>
<span id="cb7-16"><a href="#cb7-16" aria-hidden="true"></a><span class="ex">wp</span> db export /tmp/temp-backup-<span class="va">$(</span><span class="fu">date</span> +%s<span class="va">)</span>.sql.gz</span>
<span id="cb7-17"><a href="#cb7-17" aria-hidden="true"></a></span>
<span id="cb7-18"><a href="#cb7-18" aria-hidden="true"></a><span class="co"># cleanup() runs automatically when script exits</span></span></code></pre>
</div>
<h4 id="error-specific-trap">Error-Specific Trap</h4>
<div class="sourceCode" id="cb8">
<pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb8-1"><a href="#cb8-1" aria-hidden="true"></a><span class="co">#!/bin/bash</span></span>
<span id="cb8-2"><a href="#cb8-2" aria-hidden="true"></a><span class="kw">set</span> <span class="ex">-euo</span> pipefail</span>
<span id="cb8-3"><a href="#cb8-3" aria-hidden="true"></a></span>
<span id="cb8-4"><a href="#cb8-4" aria-hidden="true"></a><span class="co"># Error handler</span></span>
<span id="cb8-5"><a href="#cb8-5" aria-hidden="true"></a><span class="fu">error_handler()</span> <span class="kw">{</span></span>
<span id="cb8-6"><a href="#cb8-6" aria-hidden="true"></a>    <span class="bu">local</span> <span class="va">exit_code=$?</span></span>
<span id="cb8-7"><a href="#cb8-7" aria-hidden="true"></a>    <span class="bu">local</span> <span class="va">line_number=$1</span></span>
<span id="cb8-8"><a href="#cb8-8" aria-hidden="true"></a></span>
<span id="cb8-9"><a href="#cb8-9" aria-hidden="true"></a>    <span class="bu">echo</span> <span class="st">&quot;ERROR: Script failed at line </span><span class="va">$line_number</span><span class="st"> with exit code </span><span class="va">$exit_code</span><span class="st">&quot;</span></span>
<span id="cb8-10"><a href="#cb8-10" aria-hidden="true"></a>    <span class="bu">echo</span> <span class="st">&quot;Rolling back changes...&quot;</span></span>
<span id="cb8-11"><a href="#cb8-11" aria-hidden="true"></a></span>
<span id="cb8-12"><a href="#cb8-12" aria-hidden="true"></a>    <span class="co"># Perform rollback operations</span></span>
<span id="cb8-13"><a href="#cb8-13" aria-hidden="true"></a>    <span class="ex">wp</span> db import /backups/before-update.sql.gz <span class="op">2&gt;</span>/dev/null <span class="kw">||</span> <span class="fu">true</span></span>
<span id="cb8-14"><a href="#cb8-14" aria-hidden="true"></a></span>
<span id="cb8-15"><a href="#cb8-15" aria-hidden="true"></a>    <span class="bu">exit</span> <span class="va">$exit_code</span></span>
<span id="cb8-16"><a href="#cb8-16" aria-hidden="true"></a><span class="kw">}</span></span>
<span id="cb8-17"><a href="#cb8-17" aria-hidden="true"></a></span>
<span id="cb8-18"><a href="#cb8-18" aria-hidden="true"></a><span class="co"># Trap errors and call error_handler with line number</span></span>
<span id="cb8-19"><a href="#cb8-19" aria-hidden="true"></a><span class="bu">trap</span> <span class="st">&#39;error_handler ${LINENO}&#39;</span> ERR</span>
<span id="cb8-20"><a href="#cb8-20" aria-hidden="true"></a></span>
<span id="cb8-21"><a href="#cb8-21" aria-hidden="true"></a><span class="co"># Backup before changes</span></span>
<span id="cb8-22"><a href="#cb8-22" aria-hidden="true"></a><span class="ex">wp</span> db export /backups/before-update.sql.gz</span>
<span id="cb8-23"><a href="#cb8-23" aria-hidden="true"></a></span>
<span id="cb8-24"><a href="#cb8-24" aria-hidden="true"></a><span class="co"># Risky operation</span></span>
<span id="cb8-25"><a href="#cb8-25" aria-hidden="true"></a><span class="ex">wp</span> plugin update --all</span>
<span id="cb8-26"><a href="#cb8-26" aria-hidden="true"></a></span>
<span id="cb8-27"><a href="#cb8-27" aria-hidden="true"></a><span class="co"># If above fails, error_handler restores database</span></span></code></pre>
</div>
<p><strong>Use Case</strong>: Automatically restore database backups if update operations fail mid-process.</p>
<h4 id="advanced-trap-with-multiple-signals">Advanced Trap with Multiple Signals</h4>
<div class="sourceCode" id="cb9">
<pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb9-1"><a href="#cb9-1" aria-hidden="true"></a><span class="co">#!/bin/bash</span></span>
<span id="cb9-2"><a href="#cb9-2" aria-hidden="true"></a><span class="kw">set</span> <span class="ex">-euo</span> pipefail</span>
<span id="cb9-3"><a href="#cb9-3" aria-hidden="true"></a></span>
<span id="cb9-4"><a href="#cb9-4" aria-hidden="true"></a><span class="va">TEMP_DIR=</span><span class="st">&quot;/tmp/wp-deploy-</span><span class="va">$$</span><span class="st">&quot;</span></span>
<span id="cb9-5"><a href="#cb9-5" aria-hidden="true"></a><span class="va">BACKUP_FILE=</span><span class="st">&quot;&quot;</span></span>
<span id="cb9-6"><a href="#cb9-6" aria-hidden="true"></a></span>
<span id="cb9-7"><a href="#cb9-7" aria-hidden="true"></a><span class="co"># Comprehensive cleanup</span></span>
<span id="cb9-8"><a href="#cb9-8" aria-hidden="true"></a><span class="fu">cleanup()</span> <span class="kw">{</span></span>
<span id="cb9-9"><a href="#cb9-9" aria-hidden="true"></a>    <span class="bu">local</span> <span class="va">exit_code=$?</span></span>
<span id="cb9-10"><a href="#cb9-10" aria-hidden="true"></a></span>
<span id="cb9-11"><a href="#cb9-11" aria-hidden="true"></a>    <span class="kw">if</span><span class="bu"> [</span> <span class="va">$exit_code</span> <span class="ot">-ne</span> 0<span class="bu"> ]</span>; <span class="kw">then</span></span>
<span id="cb9-12"><a href="#cb9-12" aria-hidden="true"></a>        <span class="bu">echo</span> <span class="st">&quot;Script failed (exit code: </span><span class="va">$exit_code</span><span class="st">)&quot;</span></span>
<span id="cb9-13"><a href="#cb9-13" aria-hidden="true"></a>        <span class="bu">echo</span> <span class="st">&quot;Performing emergency cleanup...&quot;</span></span>
<span id="cb9-14"><a href="#cb9-14" aria-hidden="true"></a>    <span class="kw">fi</span></span>
<span id="cb9-15"><a href="#cb9-15" aria-hidden="true"></a></span>
<span id="cb9-16"><a href="#cb9-16" aria-hidden="true"></a>    <span class="co"># Remove temporary directory</span></span>
<span id="cb9-17"><a href="#cb9-17" aria-hidden="true"></a>    [ <span class="ex">-d</span> <span class="st">&quot;</span><span class="va">$TEMP_DIR</span><span class="st">&quot;</span> ] <span class="kw">&amp;&amp;</span> <span class="fu">rm</span> -rf <span class="st">&quot;</span><span class="va">$TEMP_DIR</span><span class="st">&quot;</span></span>
<span id="cb9-18"><a href="#cb9-18" aria-hidden="true"></a></span>
<span id="cb9-19"><a href="#cb9-19" aria-hidden="true"></a>    <span class="co"># Remove temporary backup</span></span>
<span id="cb9-20"><a href="#cb9-20" aria-hidden="true"></a>    [ <span class="ex">-n</span> <span class="st">&quot;</span><span class="va">$BACKUP_FILE</span><span class="st">&quot;</span> ] <span class="kw">&amp;&amp;</span> <span class="fu">rm</span> -f <span class="st">&quot;</span><span class="va">$BACKUP_FILE</span><span class="st">&quot;</span></span>
<span id="cb9-21"><a href="#cb9-21" aria-hidden="true"></a></span>
<span id="cb9-22"><a href="#cb9-22" aria-hidden="true"></a>    <span class="bu">echo</span> <span class="st">&quot;Cleanup complete&quot;</span></span>
<span id="cb9-23"><a href="#cb9-23" aria-hidden="true"></a><span class="kw">}</span></span>
<span id="cb9-24"><a href="#cb9-24" aria-hidden="true"></a></span>
<span id="cb9-25"><a href="#cb9-25" aria-hidden="true"></a><span class="co"># Trap multiple signals</span></span>
<span id="cb9-26"><a href="#cb9-26" aria-hidden="true"></a><span class="bu">trap</span> cleanup EXIT ERR INT TERM</span>
<span id="cb9-27"><a href="#cb9-27" aria-hidden="true"></a></span>
<span id="cb9-28"><a href="#cb9-28" aria-hidden="true"></a><span class="co"># Create temp directory</span></span>
<span id="cb9-29"><a href="#cb9-29" aria-hidden="true"></a><span class="fu">mkdir</span> -p <span class="st">&quot;</span><span class="va">$TEMP_DIR</span><span class="st">&quot;</span></span>
<span id="cb9-30"><a href="#cb9-30" aria-hidden="true"></a></span>
<span id="cb9-31"><a href="#cb9-31" aria-hidden="true"></a><span class="co"># Store backup location</span></span>
<span id="cb9-32"><a href="#cb9-32" aria-hidden="true"></a><span class="va">BACKUP_FILE=</span><span class="st">&quot;/tmp/backup-</span><span class="va">$$</span><span class="st">.sql.gz&quot;</span></span>
<span id="cb9-33"><a href="#cb9-33" aria-hidden="true"></a></span>
<span id="cb9-34"><a href="#cb9-34" aria-hidden="true"></a><span class="co"># Script operations...</span></span></code></pre>
</div>
<h3 id="input-validation">Input Validation and Argument Parsing</h3>
<p>Validate script arguments and user inputs before processing.</p>
<h4 id="validate-required-arguments">Validate Required Arguments</h4>
<div class="sourceCode" id="cb10">
<pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb10-1"><a href="#cb10-1" aria-hidden="true"></a><span class="co">#!/bin/bash</span></span>
<span id="cb10-2"><a href="#cb10-2" aria-hidden="true"></a><span class="kw">set</span> <span class="ex">-euo</span> pipefail</span>
<span id="cb10-3"><a href="#cb10-3" aria-hidden="true"></a></span>
<span id="cb10-4"><a href="#cb10-4" aria-hidden="true"></a><span class="co"># Check argument count</span></span>
<span id="cb10-5"><a href="#cb10-5" aria-hidden="true"></a><span class="kw">if</span><span class="bu"> [</span> <span class="va">$#</span> <span class="ot">-lt</span> 2<span class="bu"> ]</span>; <span class="kw">then</span></span>
<span id="cb10-6"><a href="#cb10-6" aria-hidden="true"></a>    <span class="bu">echo</span> <span class="st">&quot;Usage: </span><span class="va">$0</span><span class="st"> &lt;source_url&gt; &lt;target_url&gt;&quot;</span></span>
<span id="cb10-7"><a href="#cb10-7" aria-hidden="true"></a>    <span class="bu">echo</span> <span class="st">&quot;Example: </span><span class="va">$0</span><span class="st"> https://oldsite.com https://newsite.com&quot;</span></span>
<span id="cb10-8"><a href="#cb10-8" aria-hidden="true"></a>    <span class="bu">exit</span> 1</span>
<span id="cb10-9"><a href="#cb10-9" aria-hidden="true"></a><span class="kw">fi</span></span>
<span id="cb10-10"><a href="#cb10-10" aria-hidden="true"></a></span>
<span id="cb10-11"><a href="#cb10-11" aria-hidden="true"></a><span class="va">SOURCE_URL=</span><span class="st">&quot;</span><span class="va">$1</span><span class="st">&quot;</span></span>
<span id="cb10-12"><a href="#cb10-12" aria-hidden="true"></a><span class="va">TARGET_URL=</span><span class="st">&quot;</span><span class="va">$2</span><span class="st">&quot;</span></span>
<span id="cb10-13"><a href="#cb10-13" aria-hidden="true"></a></span>
<span id="cb10-14"><a href="#cb10-14" aria-hidden="true"></a><span class="co"># Validate URL format</span></span>
<span id="cb10-15"><a href="#cb10-15" aria-hidden="true"></a><span class="kw">if [[</span> <span class="ot">!</span> <span class="st">&quot;</span><span class="va">$SOURCE_URL</span><span class="st">&quot;</span> =~ ^https?://<span class="kw"> ]]</span>; <span class="kw">then</span></span>
<span id="cb10-16"><a href="#cb10-16" aria-hidden="true"></a>    <span class="bu">echo</span> <span class="st">&quot;Error: Source URL must start with http:// or https://&quot;</span></span>
<span id="cb10-17"><a href="#cb10-17" aria-hidden="true"></a>    <span class="bu">exit</span> 1</span>
<span id="cb10-18"><a href="#cb10-18" aria-hidden="true"></a><span class="kw">fi</span></span>
<span id="cb10-19"><a href="#cb10-19" aria-hidden="true"></a></span>
<span id="cb10-20"><a href="#cb10-20" aria-hidden="true"></a><span class="kw">if [[</span> <span class="ot">!</span> <span class="st">&quot;</span><span class="va">$TARGET_URL</span><span class="st">&quot;</span> =~ ^https?://<span class="kw"> ]]</span>; <span class="kw">then</span></span>
<span id="cb10-21"><a href="#cb10-21" aria-hidden="true"></a>    <span class="bu">echo</span> <span class="st">&quot;Error: Target URL must start with http:// or https://&quot;</span></span>
<span id="cb10-22"><a href="#cb10-22" aria-hidden="true"></a>    <span class="bu">exit</span> 1</span>
<span id="cb10-23"><a href="#cb10-23" aria-hidden="true"></a><span class="kw">fi</span></span>
<span id="cb10-24"><a href="#cb10-24" aria-hidden="true"></a></span>
<span id="cb10-25"><a href="#cb10-25" aria-hidden="true"></a><span class="co"># Safe to proceed</span></span>
<span id="cb10-26"><a href="#cb10-26" aria-hidden="true"></a><span class="ex">wp</span> search-replace <span class="st">&quot;</span><span class="va">$SOURCE_URL</span><span class="st">&quot;</span> <span class="st">&quot;</span><span class="va">$TARGET_URL</span><span class="st">&quot;</span></span></code></pre>
</div>
<h4 id="validate-user-confirmation">Validate User Confirmation</h4>
<div class="sourceCode" id="cb11">
<pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb11-1"><a href="#cb11-1" aria-hidden="true"></a><span class="co">#!/bin/bash</span></span>
<span id="cb11-2"><a href="#cb11-2" aria-hidden="true"></a><span class="kw">set</span> <span class="ex">-euo</span> pipefail</span>
<span id="cb11-3"><a href="#cb11-3" aria-hidden="true"></a></span>
<span id="cb11-4"><a href="#cb11-4" aria-hidden="true"></a><span class="bu">echo</span> <span class="st">&quot;WARNING: This will delete all WordPress posts&quot;</span></span>
<span id="cb11-5"><a href="#cb11-5" aria-hidden="true"></a><span class="bu">echo</span> <span class="st">&quot;This action cannot be undone!&quot;</span></span>
<span id="cb11-6"><a href="#cb11-6" aria-hidden="true"></a><span class="bu">read</span> -p <span class="st">&quot;Type &#39;DELETE&#39; to confirm: &quot;</span> <span class="va">CONFIRMATION</span></span>
<span id="cb11-7"><a href="#cb11-7" aria-hidden="true"></a></span>
<span id="cb11-8"><a href="#cb11-8" aria-hidden="true"></a><span class="kw">if</span><span class="bu"> [</span> <span class="st">&quot;</span><span class="va">$CONFIRMATION</span><span class="st">&quot;</span> <span class="ot">!=</span> <span class="st">&quot;DELETE&quot;</span><span class="bu"> ]</span>; <span class="kw">then</span></span>
<span id="cb11-9"><a href="#cb11-9" aria-hidden="true"></a>    <span class="bu">echo</span> <span class="st">&quot;Operation cancelled&quot;</span></span>
<span id="cb11-10"><a href="#cb11-10" aria-hidden="true"></a>    <span class="bu">exit</span> 0</span>
<span id="cb11-11"><a href="#cb11-11" aria-hidden="true"></a><span class="kw">fi</span></span>
<span id="cb11-12"><a href="#cb11-12" aria-hidden="true"></a></span>
<span id="cb11-13"><a href="#cb11-13" aria-hidden="true"></a><span class="co"># User confirmed, proceed with deletion</span></span>
<span id="cb11-14"><a href="#cb11-14" aria-hidden="true"></a><span class="ex">wp</span> post delete <span class="va">$(</span><span class="ex">wp</span> post list --format=ids<span class="va">)</span> --force</span></code></pre>
</div>
<h4 id="validate-numeric-inputs">Validate Numeric Inputs</h4>
<div class="sourceCode" id="cb12">
<pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb12-1"><a href="#cb12-1" aria-hidden="true"></a><span class="co">#!/bin/bash</span></span>
<span id="cb12-2"><a href="#cb12-2" aria-hidden="true"></a><span class="kw">set</span> <span class="ex">-euo</span> pipefail</span>
<span id="cb12-3"><a href="#cb12-3" aria-hidden="true"></a></span>
<span id="cb12-4"><a href="#cb12-4" aria-hidden="true"></a><span class="va">DAYS_TO_KEEP=</span><span class="st">&quot;</span><span class="va">${1:-</span>7<span class="va">}</span><span class="st">&quot;</span></span>
<span id="cb12-5"><a href="#cb12-5" aria-hidden="true"></a></span>
<span id="cb12-6"><a href="#cb12-6" aria-hidden="true"></a><span class="co"># Ensure input is a number</span></span>
<span id="cb12-7"><a href="#cb12-7" aria-hidden="true"></a><span class="kw">if</span> !<span class="kw"> [[</span> <span class="st">&quot;</span><span class="va">$DAYS_TO_KEEP</span><span class="st">&quot;</span> =~ ^[0-9]+$<span class="kw"> ]]</span>; <span class="kw">then</span></span>
<span id="cb12-8"><a href="#cb12-8" aria-hidden="true"></a>    <span class="bu">echo</span> <span class="st">&quot;Error: Days must be a positive number&quot;</span></span>
<span id="cb12-9"><a href="#cb12-9" aria-hidden="true"></a>    <span class="bu">exit</span> 1</span>
<span id="cb12-10"><a href="#cb12-10" aria-hidden="true"></a><span class="kw">fi</span></span>
<span id="cb12-11"><a href="#cb12-11" aria-hidden="true"></a></span>
<span id="cb12-12"><a href="#cb12-12" aria-hidden="true"></a><span class="co"># Ensure reasonable range</span></span>
<span id="cb12-13"><a href="#cb12-13" aria-hidden="true"></a><span class="kw">if</span><span class="bu"> [</span> <span class="st">&quot;</span><span class="va">$DAYS_TO_KEEP</span><span class="st">&quot;</span> <span class="ot">-lt</span> 1<span class="bu"> ]</span> <span class="kw">||</span><span class="bu"> [</span> <span class="st">&quot;</span><span class="va">$DAYS_TO_KEEP</span><span class="st">&quot;</span> <span class="ot">-gt</span> 365<span class="bu"> ]</span>; <span class="kw">then</span></span>
<span id="cb12-14"><a href="#cb12-14" aria-hidden="true"></a>    <span class="bu">echo</span> <span class="st">&quot;Error: Days must be between 1 and 365&quot;</span></span>
<span id="cb12-15"><a href="#cb12-15" aria-hidden="true"></a>    <span class="bu">exit</span> 1</span>
<span id="cb12-16"><a href="#cb12-16" aria-hidden="true"></a><span class="kw">fi</span></span>
<span id="cb12-17"><a href="#cb12-17" aria-hidden="true"></a></span>
<span id="cb12-18"><a href="#cb12-18" aria-hidden="true"></a><span class="co"># Delete old backups</span></span>
<span id="cb12-19"><a href="#cb12-19" aria-hidden="true"></a><span class="fu">find</span> /backups -name <span class="st">&quot;*.sql.gz&quot;</span> -mtime +<span class="va">$DAYS_TO_KEEP</span> -delete</span></code></pre>
</div>
<h3 id="logging">Logging and Error Reporting</h3>
<p>Track script execution and failures with comprehensive logging.</p>
<h4 id="basic-logging-function">Basic Logging Function</h4>
<div class="sourceCode" id="cb13">
<pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb13-1"><a href="#cb13-1" aria-hidden="true"></a><span class="co">#!/bin/bash</span></span>
<span id="cb13-2"><a href="#cb13-2" aria-hidden="true"></a><span class="kw">set</span> <span class="ex">-euo</span> pipefail</span>
<span id="cb13-3"><a href="#cb13-3" aria-hidden="true"></a></span>
<span id="cb13-4"><a href="#cb13-4" aria-hidden="true"></a><span class="va">LOG_FILE=</span><span class="st">&quot;/var/log/wp-automation.log&quot;</span></span>
<span id="cb13-5"><a href="#cb13-5" aria-hidden="true"></a></span>
<span id="cb13-6"><a href="#cb13-6" aria-hidden="true"></a><span class="co"># Logging function</span></span>
<span id="cb13-7"><a href="#cb13-7" aria-hidden="true"></a><span class="fu">log()</span> <span class="kw">{</span></span>
<span id="cb13-8"><a href="#cb13-8" aria-hidden="true"></a>    <span class="bu">local</span> <span class="va">level=</span><span class="st">&quot;</span><span class="va">$1</span><span class="st">&quot;</span></span>
<span id="cb13-9"><a href="#cb13-9" aria-hidden="true"></a>    <span class="bu">shift</span></span>
<span id="cb13-10"><a href="#cb13-10" aria-hidden="true"></a>    <span class="bu">local</span> <span class="va">message=</span><span class="st">&quot;</span><span class="va">$@</span><span class="st">&quot;</span></span>
<span id="cb13-11"><a href="#cb13-11" aria-hidden="true"></a>    <span class="bu">local</span> <span class="va">timestamp=$(</span><span class="fu">date</span> <span class="st">&#39;+%Y-%m-%d %H:%M:%S&#39;</span><span class="va">)</span></span>
<span id="cb13-12"><a href="#cb13-12" aria-hidden="true"></a></span>
<span id="cb13-13"><a href="#cb13-13" aria-hidden="true"></a>    <span class="bu">echo</span> <span class="st">&quot;[</span><span class="va">$timestamp</span><span class="st">] [</span><span class="va">$level</span><span class="st">] </span><span class="va">$message</span><span class="st">&quot;</span> <span class="kw">|</span> <span class="fu">tee</span> -a <span class="st">&quot;</span><span class="va">$LOG_FILE</span><span class="st">&quot;</span></span>
<span id="cb13-14"><a href="#cb13-14" aria-hidden="true"></a><span class="kw">}</span></span>
<span id="cb13-15"><a href="#cb13-15" aria-hidden="true"></a></span>
<span id="cb13-16"><a href="#cb13-16" aria-hidden="true"></a><span class="co"># Usage</span></span>
<span id="cb13-17"><a href="#cb13-17" aria-hidden="true"></a><span class="ex">log</span> INFO <span class="st">&quot;Starting WordPress backup&quot;</span></span>
<span id="cb13-18"><a href="#cb13-18" aria-hidden="true"></a><span class="ex">log</span> WARNING <span class="st">&quot;Database size is large, this may take a while&quot;</span></span>
<span id="cb13-19"><a href="#cb13-19" aria-hidden="true"></a><span class="ex">log</span> ERROR <span class="st">&quot;Backup failed: disk full&quot;</span></span></code></pre>
</div>
<h4 id="log-with-script-context">Log with Script Context</h4>
<div class="sourceCode" id="cb14">
<pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb14-1"><a href="#cb14-1" aria-hidden="true"></a><span class="co">#!/bin/bash</span></span>
<span id="cb14-2"><a href="#cb14-2" aria-hidden="true"></a><span class="kw">set</span> <span class="ex">-euo</span> pipefail</span>
<span id="cb14-3"><a href="#cb14-3" aria-hidden="true"></a></span>
<span id="cb14-4"><a href="#cb14-4" aria-hidden="true"></a><span class="va">LOG_FILE=</span><span class="st">&quot;/var/log/wp-scripts.log&quot;</span></span>
<span id="cb14-5"><a href="#cb14-5" aria-hidden="true"></a><span class="va">SCRIPT_NAME=$(</span><span class="fu">basename</span> <span class="st">&quot;</span><span class="va">$0</span><span class="st">&quot;</span><span class="va">)</span></span>
<span id="cb14-6"><a href="#cb14-6" aria-hidden="true"></a></span>
<span id="cb14-7"><a href="#cb14-7" aria-hidden="true"></a><span class="fu">log()</span> <span class="kw">{</span></span>
<span id="cb14-8"><a href="#cb14-8" aria-hidden="true"></a>    <span class="bu">echo</span> <span class="st">&quot;[</span><span class="va">$(</span><span class="fu">date</span> <span class="st">&#39;+%Y-%m-%d %H:%M:%S&#39;</span><span class="va">)</span><span class="st">] [</span><span class="va">$SCRIPT_NAME</span><span class="st">] </span><span class="va">$@</span><span class="st">&quot;</span> <span class="kw">|</span> <span class="fu">tee</span> -a <span class="st">&quot;</span><span class="va">$LOG_FILE</span><span class="st">&quot;</span></span>
<span id="cb14-9"><a href="#cb14-9" aria-hidden="true"></a><span class="kw">}</span></span>
<span id="cb14-10"><a href="#cb14-10" aria-hidden="true"></a></span>
<span id="cb14-11"><a href="#cb14-11" aria-hidden="true"></a><span class="ex">log</span> <span class="st">&quot;Script started&quot;</span></span>
<span id="cb14-12"><a href="#cb14-12" aria-hidden="true"></a><span class="ex">log</span> <span class="st">&quot;Backing up database...&quot;</span></span>
<span id="cb14-13"><a href="#cb14-13" aria-hidden="true"></a></span>
<span id="cb14-14"><a href="#cb14-14" aria-hidden="true"></a><span class="kw">if</span> <span class="ex">wp</span> db export backup.sql.gz<span class="kw">;</span> <span class="kw">then</span></span>
<span id="cb14-15"><a href="#cb14-15" aria-hidden="true"></a>    <span class="ex">log</span> <span class="st">&quot;✓ Database backup successful&quot;</span></span>
<span id="cb14-16"><a href="#cb14-16" aria-hidden="true"></a><span class="kw">else</span></span>
<span id="cb14-17"><a href="#cb14-17" aria-hidden="true"></a>    <span class="ex">log</span> <span class="st">&quot;✗ Database backup failed&quot;</span></span>
<span id="cb14-18"><a href="#cb14-18" aria-hidden="true"></a>    <span class="bu">exit</span> 1</span>
<span id="cb14-19"><a href="#cb14-19" aria-hidden="true"></a><span class="kw">fi</span></span>
<span id="cb14-20"><a href="#cb14-20" aria-hidden="true"></a></span>
<span id="cb14-21"><a href="#cb14-21" aria-hidden="true"></a><span class="ex">log</span> <span class="st">&quot;Script completed&quot;</span></span></code></pre>
</div>
<h4 id="email-notifications-on-failure">Email Notifications on Failure</h4>
<div class="sourceCode" id="cb15">
<pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb15-1"><a href="#cb15-1" aria-hidden="true"></a><span class="co">#!/bin/bash</span></span>
<span id="cb15-2"><a href="#cb15-2" aria-hidden="true"></a><span class="kw">set</span> <span class="ex">-euo</span> pipefail</span>
<span id="cb15-3"><a href="#cb15-3" aria-hidden="true"></a></span>
<span id="cb15-4"><a href="#cb15-4" aria-hidden="true"></a><span class="va">ADMIN_EMAIL=</span><span class="st">&quot;admin@example.com&quot;</span></span>
<span id="cb15-5"><a href="#cb15-5" aria-hidden="true"></a></span>
<span id="cb15-6"><a href="#cb15-6" aria-hidden="true"></a><span class="co"># Error handler with email notification</span></span>
<span id="cb15-7"><a href="#cb15-7" aria-hidden="true"></a><span class="fu">error_notify()</span> <span class="kw">{</span></span>
<span id="cb15-8"><a href="#cb15-8" aria-hidden="true"></a>    <span class="bu">local</span> <span class="va">exit_code=$?</span></span>
<span id="cb15-9"><a href="#cb15-9" aria-hidden="true"></a>    <span class="bu">local</span> <span class="va">line_number=$1</span></span>
<span id="cb15-10"><a href="#cb15-10" aria-hidden="true"></a></span>
<span id="cb15-11"><a href="#cb15-11" aria-hidden="true"></a>    <span class="co"># Prepare error message</span></span>
<span id="cb15-12"><a href="#cb15-12" aria-hidden="true"></a>    <span class="va">ERROR_MSG=</span><span class="st">&quot;WordPress automation script failed</span></span>
<span id="cb15-13"><a href="#cb15-13" aria-hidden="true"></a></span>
<span id="cb15-14"><a href="#cb15-14" aria-hidden="true"></a><span class="st">Script: </span><span class="va">$0</span></span>
<span id="cb15-15"><a href="#cb15-15" aria-hidden="true"></a><span class="st">Line: </span><span class="va">$line_number</span></span>
<span id="cb15-16"><a href="#cb15-16" aria-hidden="true"></a><span class="st">Exit Code: </span><span class="va">$exit_code</span></span>
<span id="cb15-17"><a href="#cb15-17" aria-hidden="true"></a><span class="st">Time: </span><span class="va">$(</span><span class="fu">date</span><span class="va">)</span></span>
<span id="cb15-18"><a href="#cb15-18" aria-hidden="true"></a><span class="st">Server: </span><span class="va">$(</span><span class="fu">hostname</span><span class="va">)</span></span>
<span id="cb15-19"><a href="#cb15-19" aria-hidden="true"></a></span>
<span id="cb15-20"><a href="#cb15-20" aria-hidden="true"></a><span class="st">Please investigate immediately.&quot;</span></span>
<span id="cb15-21"><a href="#cb15-21" aria-hidden="true"></a></span>
<span id="cb15-22"><a href="#cb15-22" aria-hidden="true"></a>    <span class="co"># Log error</span></span>
<span id="cb15-23"><a href="#cb15-23" aria-hidden="true"></a>    <span class="bu">echo</span> <span class="st">&quot;</span><span class="va">$ERROR_MSG</span><span class="st">&quot;</span> <span class="op">&gt;&gt;</span> /var/log/wp-errors.log</span>
<span id="cb15-24"><a href="#cb15-24" aria-hidden="true"></a></span>
<span id="cb15-25"><a href="#cb15-25" aria-hidden="true"></a>    <span class="co"># Send email</span></span>
<span id="cb15-26"><a href="#cb15-26" aria-hidden="true"></a>    <span class="bu">echo</span> <span class="st">&quot;</span><span class="va">$ERROR_MSG</span><span class="st">&quot;</span> <span class="kw">|</span> <span class="ex">mail</span> -s <span class="st">&quot;ALERT: WordPress Script Failure&quot;</span> <span class="st">&quot;</span><span class="va">$ADMIN_EMAIL</span><span class="st">&quot;</span></span>
<span id="cb15-27"><a href="#cb15-27" aria-hidden="true"></a></span>
<span id="cb15-28"><a href="#cb15-28" aria-hidden="true"></a>    <span class="bu">exit</span> <span class="va">$exit_code</span></span>
<span id="cb15-29"><a href="#cb15-29" aria-hidden="true"></a><span class="kw">}</span></span>
<span id="cb15-30"><a href="#cb15-30" aria-hidden="true"></a></span>
<span id="cb15-31"><a href="#cb15-31" aria-hidden="true"></a><span class="bu">trap</span> <span class="st">&#39;error_notify ${LINENO}&#39;</span> ERR</span>
<span id="cb15-32"><a href="#cb15-32" aria-hidden="true"></a></span>
<span id="cb15-33"><a href="#cb15-33" aria-hidden="true"></a><span class="co"># Script operations...</span></span></code></pre>
</div>
<h3 id="production-patterns">Production-Ready Error Handling Patterns</h3>
<p>Complete error handling templates for common WP-CLI operations.</p>
<h4 id="safe-database-migration-script">Safe Database Migration Script</h4>
<div class="sourceCode" id="cb16">
<pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb16-1"><a href="#cb16-1" aria-hidden="true"></a><span class="co">#!/bin/bash</span></span>
<span id="cb16-2"><a href="#cb16-2" aria-hidden="true"></a><span class="kw">set</span> <span class="ex">-euo</span> pipefail</span>
<span id="cb16-3"><a href="#cb16-3" aria-hidden="true"></a></span>
<span id="cb16-4"><a href="#cb16-4" aria-hidden="true"></a><span class="co"># Configuration</span></span>
<span id="cb16-5"><a href="#cb16-5" aria-hidden="true"></a><span class="va">SOURCE_URL=</span><span class="st">&quot;https://staging.example.com&quot;</span></span>
<span id="cb16-6"><a href="#cb16-6" aria-hidden="true"></a><span class="va">TARGET_URL=</span><span class="st">&quot;https://production.example.com&quot;</span></span>
<span id="cb16-7"><a href="#cb16-7" aria-hidden="true"></a><span class="va">BACKUP_DIR=</span><span class="st">&quot;/backups/migrations&quot;</span></span>
<span id="cb16-8"><a href="#cb16-8" aria-hidden="true"></a><span class="va">LOG_FILE=</span><span class="st">&quot;/var/log/wp-migration.log&quot;</span></span>
<span id="cb16-9"><a href="#cb16-9" aria-hidden="true"></a></span>
<span id="cb16-10"><a href="#cb16-10" aria-hidden="true"></a><span class="co"># Logging</span></span>
<span id="cb16-11"><a href="#cb16-11" aria-hidden="true"></a><span class="fu">log()</span> <span class="kw">{</span></span>
<span id="cb16-12"><a href="#cb16-12" aria-hidden="true"></a>    <span class="bu">echo</span> <span class="st">&quot;[</span><span class="va">$(</span><span class="fu">date</span> <span class="st">&#39;+%Y-%m-%d %H:%M:%S&#39;</span><span class="va">)</span><span class="st">] </span><span class="va">$@</span><span class="st">&quot;</span> <span class="kw">|</span> <span class="fu">tee</span> -a <span class="st">&quot;</span><span class="va">$LOG_FILE</span><span class="st">&quot;</span></span>
<span id="cb16-13"><a href="#cb16-13" aria-hidden="true"></a><span class="kw">}</span></span>
<span id="cb16-14"><a href="#cb16-14" aria-hidden="true"></a></span>
<span id="cb16-15"><a href="#cb16-15" aria-hidden="true"></a><span class="co"># Error handler</span></span>
<span id="cb16-16"><a href="#cb16-16" aria-hidden="true"></a><span class="fu">error_handler()</span> <span class="kw">{</span></span>
<span id="cb16-17"><a href="#cb16-17" aria-hidden="true"></a>    <span class="ex">log</span> <span class="st">&quot;ERROR: Migration failed at line </span><span class="va">$1</span><span class="st">&quot;</span></span>
<span id="cb16-18"><a href="#cb16-18" aria-hidden="true"></a>    <span class="ex">log</span> <span class="st">&quot;Rolling back to previous state...&quot;</span></span>
<span id="cb16-19"><a href="#cb16-19" aria-hidden="true"></a></span>
<span id="cb16-20"><a href="#cb16-20" aria-hidden="true"></a>    <span class="kw">if</span><span class="bu"> [</span> <span class="ot">-f</span> <span class="st">&quot;</span><span class="va">$ROLLBACK_BACKUP</span><span class="st">&quot;</span><span class="bu"> ]</span>; <span class="kw">then</span></span>
<span id="cb16-21"><a href="#cb16-21" aria-hidden="true"></a>        <span class="ex">wp</span> db import <span class="st">&quot;</span><span class="va">$ROLLBACK_BACKUP</span><span class="st">&quot;</span> <span class="kw">&amp;&amp;</span> <span class="ex">log</span> <span class="st">&quot;✓ Rollback successful&quot;</span></span>
<span id="cb16-22"><a href="#cb16-22" aria-hidden="true"></a>    <span class="kw">fi</span></span>
<span id="cb16-23"><a href="#cb16-23" aria-hidden="true"></a></span>
<span id="cb16-24"><a href="#cb16-24" aria-hidden="true"></a>    <span class="bu">exit</span> 1</span>
<span id="cb16-25"><a href="#cb16-25" aria-hidden="true"></a><span class="kw">}</span></span>
<span id="cb16-26"><a href="#cb16-26" aria-hidden="true"></a></span>
<span id="cb16-27"><a href="#cb16-27" aria-hidden="true"></a><span class="bu">trap</span> <span class="st">&#39;error_handler ${LINENO}&#39;</span> ERR</span>
<span id="cb16-28"><a href="#cb16-28" aria-hidden="true"></a></span>
<span id="cb16-29"><a href="#cb16-29" aria-hidden="true"></a><span class="co"># Start migration</span></span>
<span id="cb16-30"><a href="#cb16-30" aria-hidden="true"></a><span class="ex">log</span> <span class="st">&quot;=== WordPress Migration Started ===&quot;</span></span>
<span id="cb16-31"><a href="#cb16-31" aria-hidden="true"></a></span>
<span id="cb16-32"><a href="#cb16-32" aria-hidden="true"></a><span class="co"># Validate preconditions</span></span>
<span id="cb16-33"><a href="#cb16-33" aria-hidden="true"></a><span class="ex">log</span> <span class="st">&quot;Validating environment...&quot;</span></span>
<span id="cb16-34"><a href="#cb16-34" aria-hidden="true"></a><span class="ex">wp</span> core is-installed <span class="kw">||</span> <span class="kw">{</span> <span class="ex">log</span> <span class="st">&quot;ERROR: WordPress not installed&quot;</span><span class="kw">;</span> <span class="bu">exit</span> 1<span class="kw">;</span> <span class="kw">}</span></span>
<span id="cb16-35"><a href="#cb16-35" aria-hidden="true"></a><span class="ex">wp</span> db check <span class="kw">||</span> <span class="kw">{</span> <span class="ex">log</span> <span class="st">&quot;ERROR: Database connection failed&quot;</span><span class="kw">;</span> <span class="bu">exit</span> 1<span class="kw">;</span> <span class="kw">}</span></span>
<span id="cb16-36"><a href="#cb16-36" aria-hidden="true"></a></span>
<span id="cb16-37"><a href="#cb16-37" aria-hidden="true"></a><span class="co"># Create backup directory</span></span>
<span id="cb16-38"><a href="#cb16-38" aria-hidden="true"></a><span class="fu">mkdir</span> -p <span class="st">&quot;</span><span class="va">$BACKUP_DIR</span><span class="st">&quot;</span></span>
<span id="cb16-39"><a href="#cb16-39" aria-hidden="true"></a></span>
<span id="cb16-40"><a href="#cb16-40" aria-hidden="true"></a><span class="co"># Backup current state</span></span>
<span id="cb16-41"><a href="#cb16-41" aria-hidden="true"></a><span class="ex">log</span> <span class="st">&quot;Creating rollback backup...&quot;</span></span>
<span id="cb16-42"><a href="#cb16-42" aria-hidden="true"></a><span class="va">ROLLBACK_BACKUP=</span><span class="st">&quot;</span><span class="va">$BACKUP_DIR</span><span class="st">/rollback-</span><span class="va">$(</span><span class="fu">date</span> +%Y%m%d-%H%M%S<span class="va">)</span><span class="st">.sql.gz&quot;</span></span>
<span id="cb16-43"><a href="#cb16-43" aria-hidden="true"></a><span class="ex">wp</span> db export <span class="st">&quot;</span><span class="va">$ROLLBACK_BACKUP</span><span class="st">&quot;</span> <span class="kw">||</span> <span class="kw">{</span> <span class="ex">log</span> <span class="st">&quot;ERROR: Backup failed&quot;</span><span class="kw">;</span> <span class="bu">exit</span> 1<span class="kw">;</span> <span class="kw">}</span></span>
<span id="cb16-44"><a href="#cb16-44" aria-hidden="true"></a><span class="ex">log</span> <span class="st">&quot;✓ Rollback backup created: </span><span class="va">$ROLLBACK_BACKUP</span><span class="st">&quot;</span></span>
<span id="cb16-45"><a href="#cb16-45" aria-hidden="true"></a></span>
<span id="cb16-46"><a href="#cb16-46" aria-hidden="true"></a><span class="co"># Verify backup</span></span>
<span id="cb16-47"><a href="#cb16-47" aria-hidden="true"></a><span class="va">BACKUP_SIZE=$(</span><span class="fu">stat</span> -c%s <span class="st">&quot;</span><span class="va">$ROLLBACK_BACKUP</span><span class="st">&quot;</span><span class="va">)</span></span>
<span id="cb16-48"><a href="#cb16-48" aria-hidden="true"></a><span class="kw">if</span><span class="bu"> [</span> <span class="st">&quot;</span><span class="va">$BACKUP_SIZE</span><span class="st">&quot;</span> <span class="ot">-lt</span> 1000<span class="bu"> ]</span>; <span class="kw">then</span></span>
<span id="cb16-49"><a href="#cb16-49" aria-hidden="true"></a>    <span class="ex">log</span> <span class="st">&quot;ERROR: Backup file too small, aborting&quot;</span></span>
<span id="cb16-50"><a href="#cb16-50" aria-hidden="true"></a>    <span class="bu">exit</span> 1</span>
<span id="cb16-51"><a href="#cb16-51" aria-hidden="true"></a><span class="kw">fi</span></span>
<span id="cb16-52"><a href="#cb16-52" aria-hidden="true"></a></span>
<span id="cb16-53"><a href="#cb16-53" aria-hidden="true"></a><span class="co"># Perform search-replace (dry run first)</span></span>
<span id="cb16-54"><a href="#cb16-54" aria-hidden="true"></a><span class="ex">log</span> <span class="st">&quot;Testing URL replacement...&quot;</span></span>
<span id="cb16-55"><a href="#cb16-55" aria-hidden="true"></a><span class="kw">if</span> ! <span class="ex">wp</span> search-replace <span class="st">&quot;</span><span class="va">$SOURCE_URL</span><span class="st">&quot;</span> <span class="st">&quot;</span><span class="va">$TARGET_URL</span><span class="st">&quot;</span> --dry-run --report<span class="kw">;</span> <span class="kw">then</span></span>
<span id="cb16-56"><a href="#cb16-56" aria-hidden="true"></a>    <span class="ex">log</span> <span class="st">&quot;ERROR: Dry run failed&quot;</span></span>
<span id="cb16-57"><a href="#cb16-57" aria-hidden="true"></a>    <span class="bu">exit</span> 1</span>
<span id="cb16-58"><a href="#cb16-58" aria-hidden="true"></a><span class="kw">fi</span></span>
<span id="cb16-59"><a href="#cb16-59" aria-hidden="true"></a></span>
<span id="cb16-60"><a href="#cb16-60" aria-hidden="true"></a><span class="co"># Execute actual replacement</span></span>
<span id="cb16-61"><a href="#cb16-61" aria-hidden="true"></a><span class="ex">log</span> <span class="st">&quot;Executing URL replacement...&quot;</span></span>
<span id="cb16-62"><a href="#cb16-62" aria-hidden="true"></a><span class="ex">wp</span> search-replace <span class="st">&quot;</span><span class="va">$SOURCE_URL</span><span class="st">&quot;</span> <span class="st">&quot;</span><span class="va">$TARGET_URL</span><span class="st">&quot;</span> --report</span>
<span id="cb16-63"><a href="#cb16-63" aria-hidden="true"></a></span>
<span id="cb16-64"><a href="#cb16-64" aria-hidden="true"></a><span class="co"># Verify replacement</span></span>
<span id="cb16-65"><a href="#cb16-65" aria-hidden="true"></a><span class="va">REMAINING=$(</span><span class="ex">wp</span> search-replace <span class="st">&quot;</span><span class="va">$SOURCE_URL</span><span class="st">&quot;</span> <span class="st">&quot;</span><span class="va">$TARGET_URL</span><span class="st">&quot;</span> --dry-run --report <span class="kw">|</span> <span class="fu">grep</span> -c <span class="st">&quot;</span><span class="va">$SOURCE_URL</span><span class="st">&quot;</span> <span class="kw">||</span> <span class="fu">true</span><span class="va">)</span></span>
<span id="cb16-66"><a href="#cb16-66" aria-hidden="true"></a><span class="kw">if</span><span class="bu"> [</span> <span class="st">&quot;</span><span class="va">$REMAINING</span><span class="st">&quot;</span> <span class="ot">-gt</span> 0<span class="bu"> ]</span>; <span class="kw">then</span></span>
<span id="cb16-67"><a href="#cb16-67" aria-hidden="true"></a>    <span class="ex">log</span> <span class="st">&quot;WARNING: Some URLs may not have been replaced&quot;</span></span>
<span id="cb16-68"><a href="#cb16-68" aria-hidden="true"></a><span class="kw">fi</span></span>
<span id="cb16-69"><a href="#cb16-69" aria-hidden="true"></a></span>
<span id="cb16-70"><a href="#cb16-70" aria-hidden="true"></a><span class="co"># Update WordPress options</span></span>
<span id="cb16-71"><a href="#cb16-71" aria-hidden="true"></a><span class="ex">log</span> <span class="st">&quot;Updating WordPress options...&quot;</span></span>
<span id="cb16-72"><a href="#cb16-72" aria-hidden="true"></a><span class="ex">wp</span> option update home <span class="st">&quot;</span><span class="va">$TARGET_URL</span><span class="st">&quot;</span></span>
<span id="cb16-73"><a href="#cb16-73" aria-hidden="true"></a><span class="ex">wp</span> option update siteurl <span class="st">&quot;</span><span class="va">$TARGET_URL</span><span class="st">&quot;</span></span>
<span id="cb16-74"><a href="#cb16-74" aria-hidden="true"></a></span>
<span id="cb16-75"><a href="#cb16-75" aria-hidden="true"></a><span class="co"># Clear caches</span></span>
<span id="cb16-76"><a href="#cb16-76" aria-hidden="true"></a><span class="ex">log</span> <span class="st">&quot;Clearing caches...&quot;</span></span>
<span id="cb16-77"><a href="#cb16-77" aria-hidden="true"></a><span class="ex">wp</span> cache flush</span>
<span id="cb16-78"><a href="#cb16-78" aria-hidden="true"></a><span class="ex">wp</span> rewrite flush</span>
<span id="cb16-79"><a href="#cb16-79" aria-hidden="true"></a></span>
<span id="cb16-80"><a href="#cb16-80" aria-hidden="true"></a><span class="ex">log</span> <span class="st">&quot;=== Migration Completed Successfully ===&quot;</span></span>
<span id="cb16-81"><a href="#cb16-81" aria-hidden="true"></a><span class="ex">log</span> <span class="st">&quot;Rollback backup available at: </span><span class="va">$ROLLBACK_BACKUP</span><span class="st">&quot;</span></span></code></pre>
</div>
<h4 id="safe-plugin-update-with-fallback">Safe Plugin Update with Fallback</h4>
<div class="sourceCode" id="cb17">
<pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb17-1"><a href="#cb17-1" aria-hidden="true"></a><span class="co">#!/bin/bash</span></span>
<span id="cb17-2"><a href="#cb17-2" aria-hidden="true"></a><span class="kw">set</span> <span class="ex">-euo</span> pipefail</span>
<span id="cb17-3"><a href="#cb17-3" aria-hidden="true"></a></span>
<span id="cb17-4"><a href="#cb17-4" aria-hidden="true"></a><span class="va">BACKUP_FILE=</span><span class="st">&quot;/tmp/before-plugin-update-</span><span class="va">$$</span><span class="st">.sql.gz&quot;</span></span>
<span id="cb17-5"><a href="#cb17-5" aria-hidden="true"></a></span>
<span id="cb17-6"><a href="#cb17-6" aria-hidden="true"></a><span class="co"># Cleanup function</span></span>
<span id="cb17-7"><a href="#cb17-7" aria-hidden="true"></a><span class="fu">cleanup()</span> <span class="kw">{</span></span>
<span id="cb17-8"><a href="#cb17-8" aria-hidden="true"></a>    <span class="fu">rm</span> -f <span class="st">&quot;</span><span class="va">$BACKUP_FILE</span><span class="st">&quot;</span></span>
<span id="cb17-9"><a href="#cb17-9" aria-hidden="true"></a><span class="kw">}</span></span>
<span id="cb17-10"><a href="#cb17-10" aria-hidden="true"></a></span>
<span id="cb17-11"><a href="#cb17-11" aria-hidden="true"></a><span class="bu">trap</span> cleanup EXIT</span>
<span id="cb17-12"><a href="#cb17-12" aria-hidden="true"></a></span>
<span id="cb17-13"><a href="#cb17-13" aria-hidden="true"></a><span class="co"># Error handler</span></span>
<span id="cb17-14"><a href="#cb17-14" aria-hidden="true"></a><span class="fu">error_handler()</span> <span class="kw">{</span></span>
<span id="cb17-15"><a href="#cb17-15" aria-hidden="true"></a>    <span class="bu">echo</span> <span class="st">&quot;ERROR: Plugin update failed, restoring backup...&quot;</span></span>
<span id="cb17-16"><a href="#cb17-16" aria-hidden="true"></a></span>
<span id="cb17-17"><a href="#cb17-17" aria-hidden="true"></a>    <span class="kw">if</span><span class="bu"> [</span> <span class="ot">-f</span> <span class="st">&quot;</span><span class="va">$BACKUP_FILE</span><span class="st">&quot;</span><span class="bu"> ]</span>; <span class="kw">then</span></span>
<span id="cb17-18"><a href="#cb17-18" aria-hidden="true"></a>        <span class="ex">wp</span> db import <span class="st">&quot;</span><span class="va">$BACKUP_FILE</span><span class="st">&quot;</span> <span class="kw">&amp;&amp;</span> <span class="bu">echo</span> <span class="st">&quot;✓ Database restored&quot;</span></span>
<span id="cb17-19"><a href="#cb17-19" aria-hidden="true"></a>    <span class="kw">fi</span></span>
<span id="cb17-20"><a href="#cb17-20" aria-hidden="true"></a></span>
<span id="cb17-21"><a href="#cb17-21" aria-hidden="true"></a>    <span class="bu">exit</span> 1</span>
<span id="cb17-22"><a href="#cb17-22" aria-hidden="true"></a><span class="kw">}</span></span>
<span id="cb17-23"><a href="#cb17-23" aria-hidden="true"></a></span>
<span id="cb17-24"><a href="#cb17-24" aria-hidden="true"></a><span class="bu">trap</span> error_handler ERR</span>
<span id="cb17-25"><a href="#cb17-25" aria-hidden="true"></a></span>
<span id="cb17-26"><a href="#cb17-26" aria-hidden="true"></a><span class="co"># Backup database</span></span>
<span id="cb17-27"><a href="#cb17-27" aria-hidden="true"></a><span class="bu">echo</span> <span class="st">&quot;Creating safety backup...&quot;</span></span>
<span id="cb17-28"><a href="#cb17-28" aria-hidden="true"></a><span class="ex">wp</span> db export <span class="st">&quot;</span><span class="va">$BACKUP_FILE</span><span class="st">&quot;</span></span>
<span id="cb17-29"><a href="#cb17-29" aria-hidden="true"></a></span>
<span id="cb17-30"><a href="#cb17-30" aria-hidden="true"></a><span class="co"># Check for available updates</span></span>
<span id="cb17-31"><a href="#cb17-31" aria-hidden="true"></a><span class="va">UPDATES=$(</span><span class="ex">wp</span> plugin list --update=available --format=count<span class="va">)</span></span>
<span id="cb17-32"><a href="#cb17-32" aria-hidden="true"></a></span>
<span id="cb17-33"><a href="#cb17-33" aria-hidden="true"></a><span class="kw">if</span><span class="bu"> [</span> <span class="st">&quot;</span><span class="va">$UPDATES</span><span class="st">&quot;</span> <span class="ot">-eq</span> 0<span class="bu"> ]</span>; <span class="kw">then</span></span>
<span id="cb17-34"><a href="#cb17-34" aria-hidden="true"></a>    <span class="bu">echo</span> <span class="st">&quot;No plugin updates available&quot;</span></span>
<span id="cb17-35"><a href="#cb17-35" aria-hidden="true"></a>    <span class="bu">exit</span> 0</span>
<span id="cb17-36"><a href="#cb17-36" aria-hidden="true"></a><span class="kw">fi</span></span>
<span id="cb17-37"><a href="#cb17-37" aria-hidden="true"></a></span>
<span id="cb17-38"><a href="#cb17-38" aria-hidden="true"></a><span class="bu">echo</span> <span class="st">&quot;</span><span class="va">$UPDATES</span><span class="st"> plugin(s) have updates available&quot;</span></span>
<span id="cb17-39"><a href="#cb17-39" aria-hidden="true"></a></span>
<span id="cb17-40"><a href="#cb17-40" aria-hidden="true"></a><span class="co"># Update plugins</span></span>
<span id="cb17-41"><a href="#cb17-41" aria-hidden="true"></a><span class="bu">echo</span> <span class="st">&quot;Updating plugins...&quot;</span></span>
<span id="cb17-42"><a href="#cb17-42" aria-hidden="true"></a><span class="ex">wp</span> plugin update --all</span>
<span id="cb17-43"><a href="#cb17-43" aria-hidden="true"></a></span>
<span id="cb17-44"><a href="#cb17-44" aria-hidden="true"></a><span class="co"># Verify WordPress still works</span></span>
<span id="cb17-45"><a href="#cb17-45" aria-hidden="true"></a><span class="bu">echo</span> <span class="st">&quot;Verifying WordPress installation...&quot;</span></span>
<span id="cb17-46"><a href="#cb17-46" aria-hidden="true"></a><span class="ex">wp</span> core is-installed <span class="kw">||</span> <span class="ex">error_handler</span></span>
<span id="cb17-47"><a href="#cb17-47" aria-hidden="true"></a></span>
<span id="cb17-48"><a href="#cb17-48" aria-hidden="true"></a><span class="bu">echo</span> <span class="st">&quot;✓ All plugins updated successfully&quot;</span></span>
<span id="cb17-49"><a href="#cb17-49" aria-hidden="true"></a><span class="bu">echo</span> <span class="st">&quot;Backup file will be deleted on exit&quot;</span></span></code></pre>
</div>
<h3 id="next-steps">Next Steps</h3>
<p>You now have professional error handling skills for WP-CLI Bash scripts.</p>
<h4 id="recommended-learning-path">Recommended Learning Path</h4>
<p><strong>Week 1</strong>: Basic error handling</p>
<ul>
<li>Implement exit code checking</li>
<li>Add input validation</li>
<li>Use set -euo pipefail</li>
</ul>
<p><strong>Week 2</strong>: Advanced trapping</p>
<ul>
<li>Create cleanup functions</li>
<li>Implement error handlers</li>
<li>Build rollback mechanisms</li>
</ul>
<p><strong>Week 3</strong>: Logging and monitoring</p>
<ul>
<li>Add comprehensive logging</li>
<li>Set up email notifications</li>
<li>Create error tracking</li>
</ul>
<p><strong>Week 4</strong>: Production hardening</p>
<ul>
<li>Review all scripts for error handling</li>
<li>Create script templates</li>
<li>Document recovery procedures</li>
</ul>
<h4 id="advanced-topics">Advanced Topics</h4>
<ol type="1">
<li><strong><a href="#">Bash Script Testing</a></strong> &#8211; Unit testing for Bash scripts</li>
<li><strong><a href="#">Monitoring and Alerting</a></strong> &#8211; Production script monitoring</li>
<li><strong><a href="#">Incident Response</a></strong> &#8211; Handling script failures in production</li>
</ol>
<h4 id="get-more-resources">Get More Resources</h4>
<p><strong><a href="#">Download error handling templates</a></strong> including:</p>
<ul>
<li>Production-ready script templates</li>
<li>Error handling checklist</li>
<li>Common error patterns</li>
</ul>
<p><strong><a href="/#get-started">Join our email course</a></strong> for:</p>
<ul>
<li>Weekly WP-CLI tutorials</li>
<li>Advanced scripting techniques</li>
<li>DevOps best practices</li>
</ul>
<h3 id="conclusion">Conclusion</h3>
<p>Proper error handling transforms fragile scripts into production-ready automation that you can trust with critical WordPress operations.</p>
<p>What we covered:</p>
<p>✅ Exit codes and error detection fundamentals ✅ Validation and precondition checking ✅ Error trapping and automatic cleanup with trap ✅ Input validation and argument parsing ✅ Comprehensive logging and error reporting ✅ Production-ready error handling patterns</p>
<p>Master these techniques, and you’ll write WordPress automation scripts that gracefully handle failures, protect your data, and make debugging trivial.</p>
<p><strong>Ready for more?</strong> Learn <a href="#">advanced Bash scripting patterns</a> or <a href="#">WP-CLI script testing</a>.</p>
<p><strong>Questions about error handling in WP-CLI scripts?</strong> Drop a comment below!</p>
<p><strong>Found this helpful?</strong> Share with other WordPress developers.</p>
<p>The post <a href="https://wpclimastery.com/blog/bulletproof-error-handling-in-bash-scripts-for-wp-cli-complete-guide/">Bulletproof Error Handling in Bash Scripts for WP-CLI (Complete Guide)</a> appeared first on <a href="https://wpclimastery.com">WP-CLI Mastery</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
