summaryrefslogtreecommitdiff
path: root/gemfeed/2021-05-16-personal-bash-coding-style-guide.html
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2025-06-23 07:55:27 +0300
committerPaul Buetow <paul@buetow.org>2025-06-23 07:55:27 +0300
commitd2be28ca4b86021518caddac606e553a54dd8927 (patch)
treee7c622c27973f6feff85c7be9b8f4e94fcafcfbd /gemfeed/2021-05-16-personal-bash-coding-style-guide.html
parentb4151488cc973e8ed3f507cb850ece7f0d9d40cd (diff)
Update content for html
Diffstat (limited to 'gemfeed/2021-05-16-personal-bash-coding-style-guide.html')
-rw-r--r--gemfeed/2021-05-16-personal-bash-coding-style-guide.html276
1 files changed, 138 insertions, 138 deletions
diff --git a/gemfeed/2021-05-16-personal-bash-coding-style-guide.html b/gemfeed/2021-05-16-personal-bash-coding-style-guide.html
index 75c528c3..f34a8170 100644
--- a/gemfeed/2021-05-16-personal-bash-coding-style-guide.html
+++ b/gemfeed/2021-05-16-personal-bash-coding-style-guide.html
@@ -66,7 +66,7 @@
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
-<pre><i><font color="#00ff00">#!/bin/bash </font></i>
+<pre><i><font color="silver">#!/bin/bash </font></i>
</pre>
<br />
<span>... as the shebang line, but that does not work on all Unix and Unix-like operating systems (e.g., the *BSDs don&#39;t have Bash installed to /bin/bash). Better is:</span><br />
@@ -75,7 +75,7 @@ http://www.gnu.org/software/src-highlite -->
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
-<pre><i><font color="#00ff00">#!/usr/bin/env bash</font></i>
+<pre><i><font color="silver">#!/usr/bin/env bash</font></i>
</pre>
<br />
<h3 style='display: inline' id='two-space-soft-tabs-indentation'>Two space soft-tabs indentation</h3><br />
@@ -96,14 +96,14 @@ http://www.gnu.org/software/src-highlite -->
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
-<pre><i><font color="#00ff00"># All fits on one line</font></i>
-<font color="#ffffff">command1 </font><b><font color="#ee5896">|</font></b><font color="#ffffff"> command2</font>
+<pre><i><font color="silver"># All fits on one line</font></i>
+command1 | command2
-<i><font color="#00ff00"># Long commands</font></i>
-<font color="#ffffff">command1 </font><b><font color="#ee5896">\</font></b>
-<font color="#ffffff"> </font><b><font color="#ee5896">|</font></b><font color="#ffffff"> command2 </font><b><font color="#ee5896">\</font></b>
-<font color="#ffffff"> </font><b><font color="#ee5896">|</font></b><font color="#ffffff"> command3 </font><b><font color="#ee5896">\</font></b>
-<font color="#ffffff"> </font><b><font color="#ee5896">|</font></b><font color="#ffffff"> command4</font>
+<i><font color="silver"># Long commands</font></i>
+command1 \
+ | command2 \
+ | command3 \
+ | command4
</pre>
<br />
<span>I think there is a better way like the following, which is less noisy. The pipe | already indicates the Bash that another command is expected, thus making the explicit line breaks with \ obsolete:</span><br />
@@ -112,11 +112,11 @@ http://www.gnu.org/software/src-highlite -->
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
-<pre><i><font color="#00ff00"># Long commands</font></i>
-<font color="#ffffff">command1 </font><b><font color="#ee5896">|</font></b>
-<font color="#ffffff"> command2 </font><b><font color="#ee5896">|</font></b>
-<font color="#ffffff"> command3 </font><b><font color="#ee5896">|</font></b>
-<font color="#ffffff"> command4</font>
+<pre><i><font color="silver"># Long commands</font></i>
+command1 |
+ command2 |
+ command3 |
+ command4
</pre>
<br />
<span class='quote'>Update: It&#39;s 2023 now, and I have changed my mind. I think Google&#39;s way is the better one. It may be a bit more to type, but the leading <span class='inlinecode'>|</span> are a nice eye catcher, so you know immediately what is going on!</span><br />
@@ -129,11 +129,11 @@ http://www.gnu.org/software/src-highlite -->
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
-<pre><b><font color="#ffffff">greet ()</font></b><font color="#ffffff"> {</font>
-<font color="#ffffff"> </font><b><font color="#00ffff">local</font></b><font color="#ffffff"> -r </font><font color="#ffffff">greeting</font><b><font color="#ee5896">=</font></b><font color="#cd00ff">"${1}"</font>
-<font color="#ffffff"> </font><b><font color="#00ffff">local</font></b><font color="#ffffff"> -r </font><font color="#ffffff">name</font><b><font color="#ee5896">=</font></b><font color="#cd00ff">"${2}"</font>
-<font color="#ffffff"> echo </font><font color="#cd00ff">"${greeting} ${name}!"</font>
-<font color="#ffffff">}</font>
+<pre>greet () {
+ <b><u><font color="#000000">local</font></u></b> -r greeting=<font color="#808080">"${1}"</font>
+ <b><u><font color="#000000">local</font></u></b> -r name=<font color="#808080">"${2}"</font>
+ echo <font color="#808080">"${greeting} ${name}!"</font>
+}
</pre>
<br />
<span>In this particular example, I agree that you should quote them as you don&#39;t know the input (are there, for example, whitespace characters?). But if you are sure that you are only using simple bare words, then I think that the code looks much cleaner when you do this instead:</span><br />
@@ -142,11 +142,11 @@ http://www.gnu.org/software/src-highlite -->
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
-<pre><b><font color="#ffffff">say_hello_to_paul ()</font></b><font color="#ffffff"> {</font>
-<font color="#ffffff"> </font><b><font color="#00ffff">local</font></b><font color="#ffffff"> -r </font><font color="#ffffff">greeting</font><b><font color="#ee5896">=</font></b><font color="#ffffff">Hello</font>
-<font color="#ffffff"> </font><b><font color="#00ffff">local</font></b><font color="#ffffff"> -r </font><font color="#ffffff">name</font><b><font color="#ee5896">=</font></b><font color="#ffffff">Paul</font>
-<font color="#ffffff"> echo </font><font color="#cd00ff">"$greeting $name!"</font>
-<font color="#ffffff">}</font>
+<pre>say_hello_to_paul () {
+ <b><u><font color="#000000">local</font></u></b> -r greeting=Hello
+ <b><u><font color="#000000">local</font></u></b> -r name=Paul
+ echo <font color="#808080">"$greeting $name!"</font>
+}
</pre>
<br />
<span>You see, I also omitted the curly braces { } around the variables. I only use the curly braces around variables when it makes the code either easier/clearer to read or if it is necessary to use them:</span><br />
@@ -155,9 +155,9 @@ http://www.gnu.org/software/src-highlite -->
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
-<pre><b><font color="#00ffff">declare</font></b><font color="#ffffff"> </font><font color="#ffffff">FOO</font><b><font color="#ee5896">=</font></b><font color="#ffffff">bar</font>
-<i><font color="#00ff00"># Curly braces around FOO are necessary</font></i>
-<font color="#ffffff">echo </font><font color="#cd00ff">"foo${FOO}baz"</font>
+<pre><b><u><font color="#000000">declare</font></u></b> FOO=bar
+<i><font color="silver"># Curly braces around FOO are necessary</font></i>
+echo <font color="#808080">"foo${FOO}baz"</font>
</pre>
<br />
<span>A few more words on always quoting the variables: For the sake of consistency (and for making ShellCheck happy), I am not against quoting everything I encounter. I also think that the larger the Bash script becomes, the more critical it becomes always to quote variables. That&#39;s because it will be more likely that you might not remember that some of the functions don&#39;t work on values with spaces in them, for example. It&#39;s just that I won&#39;t quote everything in every small script I write. </span><br />
@@ -170,13 +170,13 @@ http://www.gnu.org/software/src-highlite -->
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
-<pre><i><font color="#00ff00"># Prefer this:</font></i>
-<font color="#ffffff">addition</font><b><font color="#ee5896">=</font></b><font color="#ffffff">$(</font><b><font color="#ee5896">(</font></b><font color="#ffffff"> X </font><b><font color="#ee5896">+</font></b><font color="#ffffff"> Y </font><b><font color="#ee5896">))</font></b>
-<font color="#ffffff">substitution</font><b><font color="#ee5896">=</font></b><font color="#cd00ff">"${string/#foo/bar}"</font>
+<pre><i><font color="silver"># Prefer this:</font></i>
+addition=$(( X + Y ))
+substitution=<font color="#808080">"${string/#foo/bar}"</font>
-<i><font color="#00ff00"># Instead of this:</font></i>
-<font color="#ffffff">addition</font><b><font color="#ee5896">=</font></b><font color="#cd00ff">"$(expr "</font><font color="#ffffff">${X}</font><font color="#cd00ff">" + "</font><font color="#ffffff">${Y}</font><font color="#cd00ff">")"</font>
-<font color="#ffffff">substitution</font><b><font color="#ee5896">=</font></b><font color="#cd00ff">"$(echo "</font><font color="#ffffff">${string}</font><font color="#cd00ff">" | sed -e 's/^foo/bar/')"</font>
+<i><font color="silver"># Instead of this:</font></i>
+addition=<font color="#808080">"$(expr "</font>${X}<font color="#808080">" + "</font>${Y}<font color="#808080">")"</font>
+substitution=<font color="#808080">"$(echo "</font>${string}<font color="#808080">" | sed -e 's/^foo/bar/')"</font>
</pre>
<br />
<span>I can&#39;t entirely agree here. The external commands (especially sed) are much more sophisticated and powerful than the built-in Bash versions. Sed can do much more than the Bash can ever do by itself when it comes to text manipulation (the name "sed" stands for streaming editor, after all).</span><br />
@@ -197,20 +197,20 @@ http://www.gnu.org/software/src-highlite -->
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
-<pre><b><font color="#00ffff">declare</font></b><font color="#ffffff"> -r </font><font color="#ffffff">SUGAR_FREE</font><b><font color="#ee5896">=</font></b><font color="#ffffff">yes</font>
-<b><font color="#00ffff">declare</font></b><font color="#ffffff"> -r </font><font color="#ffffff">I_NEED_THE_BUZZ</font><b><font color="#ee5896">=</font></b><font color="#ffffff">no</font>
+<pre><b><u><font color="#000000">declare</font></u></b> -r SUGAR_FREE=yes
+<b><u><font color="#000000">declare</font></u></b> -r I_NEED_THE_BUZZ=no
-<b><font color="#ffffff">buy_soda ()</font></b><font color="#ffffff"> {</font>
-<font color="#ffffff"> </font><b><font color="#00ffff">local</font></b><font color="#ffffff"> -r </font><font color="#ffffff">sugar_free</font><b><font color="#ee5896">=</font></b><font color="#ffffff">$1</font>
+buy_soda () {
+ <b><u><font color="#000000">local</font></u></b> -r sugar_free=$1
-<font color="#ffffff"> </font><b><font color="#00ffff">if</font></b><font color="#ffffff"> </font><b><font color="#ee5896">[[</font></b><font color="#ffffff"> </font><font color="#ffffff">$sugar_free</font><font color="#ffffff"> </font><b><font color="#ee5896">==</font></b><font color="#ffffff"> yes </font><b><font color="#ee5896">]];</font></b><font color="#ffffff"> </font><b><font color="#00ffff">then</font></b>
-<font color="#ffffff"> echo </font><font color="#cd00ff">'Diet Dr. Pepper'</font>
-<font color="#ffffff"> </font><b><font color="#00ffff">else</font></b>
-<font color="#ffffff"> echo </font><font color="#cd00ff">'Pepsi Coke'</font>
-<font color="#ffffff"> </font><b><font color="#00ffff">fi</font></b>
-<font color="#ffffff">}</font>
+ <b><u><font color="#000000">if</font></u></b> [[ $sugar_free == yes ]]; <b><u><font color="#000000">then</font></u></b>
+ echo <font color="#808080">'Diet Dr. Pepper'</font>
+ <b><u><font color="#000000">else</font></u></b>
+ echo <font color="#808080">'Pepsi Coke'</font>
+ <b><u><font color="#000000">fi</font></u></b>
+}
-<font color="#ffffff">buy_soda </font><font color="#ffffff">$I_NEED_THE_BUZZ</font>
+buy_soda $I_NEED_THE_BUZZ
</pre>
<br />
<h3 style='display: inline' id='non-evil-alternative-to-variable-assignments-via-eval'>Non-evil alternative to variable assignments via eval</h3><br />
@@ -221,12 +221,12 @@ http://www.gnu.org/software/src-highlite -->
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
-<pre><i><font color="#00ff00"># What does this set?</font></i>
-<i><font color="#00ff00"># Did it succeed? In part or whole?</font></i>
-<b><font color="#00ffff">eval</font></b><font color="#ffffff"> </font><font color="#ffffff">$(set_my_variables)</font>
+<pre><i><font color="silver"># What does this set?</font></i>
+<i><font color="silver"># Did it succeed? In part or whole?</font></i>
+<b><u><font color="#000000">eval</font></u></b> $(set_my_variables)
-<i><font color="#00ff00"># What happens if one of the returned values has a space in it?</font></i>
-<font color="#ffffff">variable</font><b><font color="#ee5896">=</font></b><font color="#cd00ff">"$(eval some_function)"</font>
+<i><font color="silver"># What happens if one of the returned values has a space in it?</font></i>
+variable=<font color="#808080">"$(eval some_function)"</font>
</pre>
<br />
<span>However, if I want to read variables from another file, I don&#39;t have to use eval here. I only have to source the file:</span><br />
@@ -265,39 +265,39 @@ Hello paul, it is Sat 15 May 19:21:12 BST 2021
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
-<pre><b><font color="#ffffff">filter_lines ()</font></b><font color="#ffffff"> {</font>
-<font color="#ffffff"> echo </font><font color="#cd00ff">'Start filtering lines in a fancy way!'</font><font color="#ffffff"> </font><b><font color="#ee5896">&gt;&amp;</font></b><font color="#ff00ff">2</font>
-<font color="#ffffff"> grep </font><b><font color="#ee5896">...</font></b><font color="#ffffff"> </font><b><font color="#ee5896">|</font></b><font color="#ffffff"> sed </font><b><font color="#ee5896">....</font></b>
-<font color="#ffffff">}</font>
+<pre>filter_lines () {
+ echo <font color="#808080">'Start filtering lines in a fancy way!'</font> &gt;&amp;<font color="#000000">2</font>
+ grep ... | sed ....
+}
-<b><font color="#ffffff">process_lines ()</font></b><font color="#ffffff"> {</font>
-<font color="#ffffff"> echo </font><font color="#cd00ff">'Start processing line by line!'</font><font color="#ffffff"> </font><b><font color="#ee5896">&gt;&amp;</font></b><font color="#ff00ff">2</font>
-<font color="#ffffff"> </font><b><font color="#00ffff">while</font></b><font color="#ffffff"> </font><b><font color="#00ffff">read</font></b><font color="#ffffff"> -r line</font><b><font color="#ee5896">;</font></b><font color="#ffffff"> </font><b><font color="#00ffff">do</font></b>
-<font color="#ffffff"> </font><b><font color="#ee5896">...</font></b><font color="#ffffff"> </font><b><font color="#00ffff">do</font></b><font color="#ffffff"> something and produce a result</font><b><font color="#ee5896">...</font></b>
-<font color="#ffffff"> echo </font><font color="#cd00ff">"$result"</font>
-<font color="#ffffff"> </font><b><font color="#00ffff">done</font></b><font color="#ffffff"> </font>
-<font color="#ffffff">}</font>
+process_lines () {
+ echo <font color="#808080">'Start processing line by line!'</font> &gt;&amp;<font color="#000000">2</font>
+ <b><u><font color="#000000">while</font></u></b> <b><u><font color="#000000">read</font></u></b> -r line; <b><u><font color="#000000">do</font></u></b>
+ ... <b><u><font color="#000000">do</font></u></b> something and produce a result...
+ echo <font color="#808080">"$result"</font>
+ <b><u><font color="#000000">done</font></u></b>
+}
-<i><font color="#00ff00"># Do some post-processing of the data</font></i>
-<b><font color="#ffffff">postprocess_lines ()</font></b><font color="#ffffff"> {</font>
-<font color="#ffffff"> echo </font><font color="#cd00ff">'Start removing duplicates!'</font><font color="#ffffff"> </font><b><font color="#ee5896">&gt;&amp;</font></b><font color="#ff00ff">2</font>
-<font color="#ffffff"> sort -u</font>
-<font color="#ffffff">}</font>
+<i><font color="silver"># Do some post-processing of the data</font></i>
+postprocess_lines () {
+ echo <font color="#808080">'Start removing duplicates!'</font> &gt;&amp;<font color="#000000">2</font>
+ sort -u
+}
-<b><font color="#ffffff">genreate_report ()</font></b><font color="#ffffff"> {</font>
-<font color="#ffffff"> echo </font><font color="#cd00ff">'My boss wants to have a report!'</font><font color="#ffffff"> </font><b><font color="#ee5896">&gt;&amp;</font></b><font color="#ff00ff">2</font>
-<font color="#ffffff"> tee outfile</font><b><font color="#ee5896">.</font></b><font color="#ffffff">txt</font>
-<font color="#ffffff"> wc -l outfile</font><b><font color="#ee5896">.</font></b><font color="#ffffff">txt</font>
-<font color="#ffffff">}</font>
+genreate_report () {
+ echo <font color="#808080">'My boss wants to have a report!'</font> &gt;&amp;<font color="#000000">2</font>
+ tee outfile.txt
+ wc -l outfile.txt
+}
-<b><font color="#ffffff">main ()</font></b><font color="#ffffff"> {</font>
-<font color="#ffffff"> filter_lines </font><b><font color="#ee5896">|</font></b>
-<font color="#ffffff"> process_lines </font><b><font color="#ee5896">|</font></b>
-<font color="#ffffff"> postprocess_lines </font><b><font color="#ee5896">|</font></b>
-<font color="#ffffff"> generate_report</font>
-<font color="#ffffff">}</font>
+main () {
+ filter_lines |
+ process_lines |
+ postprocess_lines |
+ generate_report
+}
-<font color="#ffffff">main</font>
+main
</pre>
<br />
<span>The stdout is always passed as a pipe to the next following stage. The stderr is used for info logging.</span><br />
@@ -312,13 +312,13 @@ http://www.gnu.org/software/src-highlite -->
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
-<pre><b><font color="#ffffff">some_function ()</font></b><font color="#ffffff"> {</font>
-<font color="#ffffff"> </font><b><font color="#00ffff">local</font></b><font color="#ffffff"> -r </font><font color="#ffffff">param_foo</font><b><font color="#ee5896">=</font></b><font color="#cd00ff">"$1"</font><b><font color="#ee5896">;</font></b><font color="#ffffff"> </font><b><font color="#00ffff">shift</font></b>
-<font color="#ffffff"> </font><b><font color="#00ffff">local</font></b><font color="#ffffff"> -r </font><font color="#ffffff">param_baz</font><b><font color="#ee5896">=</font></b><font color="#cd00ff">"$1"</font><b><font color="#ee5896">;</font></b><font color="#ffffff"> </font><b><font color="#00ffff">shift</font></b>
-<font color="#ffffff"> </font><b><font color="#00ffff">local</font></b><font color="#ffffff"> -r </font><font color="#ffffff">param_bay</font><b><font color="#ee5896">=</font></b><font color="#cd00ff">"$1"</font><b><font color="#ee5896">;</font></b><font color="#ffffff"> </font><b><font color="#00ffff">shift</font></b>
+<pre>some_function () {
+ <b><u><font color="#000000">local</font></u></b> -r param_foo=<font color="#808080">"$1"</font>; <b><u><font color="#000000">shift</font></u></b>
+ <b><u><font color="#000000">local</font></u></b> -r param_baz=<font color="#808080">"$1"</font>; <b><u><font color="#000000">shift</font></u></b>
+ <b><u><font color="#000000">local</font></u></b> -r param_bay=<font color="#808080">"$1"</font>; <b><u><font color="#000000">shift</font></u></b>
-<font color="#ffffff"> </font><i><font color="#00ff00"># ...</font></i>
-<font color="#ffffff">}</font>
+ <i><font color="silver"># ...</font></i>
+}
</pre>
<br />
<span>Want to add a param_baz? Just do this:</span><br />
@@ -327,14 +327,14 @@ http://www.gnu.org/software/src-highlite -->
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
-<pre><b><font color="#ffffff">some_function ()</font></b><font color="#ffffff"> {</font>
-<font color="#ffffff"> </font><b><font color="#00ffff">local</font></b><font color="#ffffff"> -r </font><font color="#ffffff">param_foo</font><b><font color="#ee5896">=</font></b><font color="#cd00ff">"$1"</font><b><font color="#ee5896">;</font></b><font color="#ffffff"> </font><b><font color="#00ffff">shift</font></b>
-<font color="#ffffff"> </font><b><font color="#00ffff">local</font></b><font color="#ffffff"> -r </font><font color="#ffffff">param_bar</font><b><font color="#ee5896">=</font></b><font color="#cd00ff">"$1"</font><b><font color="#ee5896">;</font></b><font color="#ffffff"> </font><b><font color="#00ffff">shift</font></b>
-<font color="#ffffff"> </font><b><font color="#00ffff">local</font></b><font color="#ffffff"> -r </font><font color="#ffffff">param_baz</font><b><font color="#ee5896">=</font></b><font color="#cd00ff">"$1"</font><b><font color="#ee5896">;</font></b><font color="#ffffff"> </font><b><font color="#00ffff">shift</font></b>
-<font color="#ffffff"> </font><b><font color="#00ffff">local</font></b><font color="#ffffff"> -r </font><font color="#ffffff">param_bay</font><b><font color="#ee5896">=</font></b><font color="#cd00ff">"$1"</font><b><font color="#ee5896">;</font></b><font color="#ffffff"> </font><b><font color="#00ffff">shift</font></b>
+<pre>some_function () {
+ <b><u><font color="#000000">local</font></u></b> -r param_foo=<font color="#808080">"$1"</font>; <b><u><font color="#000000">shift</font></u></b>
+ <b><u><font color="#000000">local</font></u></b> -r param_bar=<font color="#808080">"$1"</font>; <b><u><font color="#000000">shift</font></u></b>
+ <b><u><font color="#000000">local</font></u></b> -r param_baz=<font color="#808080">"$1"</font>; <b><u><font color="#000000">shift</font></u></b>
+ <b><u><font color="#000000">local</font></u></b> -r param_bay=<font color="#808080">"$1"</font>; <b><u><font color="#000000">shift</font></u></b>
-<font color="#ffffff"> </font><i><font color="#00ff00"># ...</font></i>
-<font color="#ffffff">}</font>
+ <i><font color="silver"># ...</font></i>
+}
</pre>
<br />
<span>Want to remove param_foo? Nothing easier than that:</span><br />
@@ -343,13 +343,13 @@ http://www.gnu.org/software/src-highlite -->
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
-<pre><b><font color="#ffffff">some_function ()</font></b><font color="#ffffff"> {</font>
-<font color="#ffffff"> </font><b><font color="#00ffff">local</font></b><font color="#ffffff"> -r </font><font color="#ffffff">param_bar</font><b><font color="#ee5896">=</font></b><font color="#cd00ff">"$1"</font><b><font color="#ee5896">;</font></b><font color="#ffffff"> </font><b><font color="#00ffff">shift</font></b>
-<font color="#ffffff"> </font><b><font color="#00ffff">local</font></b><font color="#ffffff"> -r </font><font color="#ffffff">param_baz</font><b><font color="#ee5896">=</font></b><font color="#cd00ff">"$1"</font><b><font color="#ee5896">;</font></b><font color="#ffffff"> </font><b><font color="#00ffff">shift</font></b>
-<font color="#ffffff"> </font><b><font color="#00ffff">local</font></b><font color="#ffffff"> -r </font><font color="#ffffff">param_bay</font><b><font color="#ee5896">=</font></b><font color="#cd00ff">"$1"</font><b><font color="#ee5896">;</font></b><font color="#ffffff"> </font><b><font color="#00ffff">shift</font></b>
-<font color="#ffffff"> </font>
-<font color="#ffffff"> </font><i><font color="#00ff00"># ...</font></i>
-<font color="#ffffff">}</font>
+<pre>some_function () {
+ <b><u><font color="#000000">local</font></u></b> -r param_bar=<font color="#808080">"$1"</font>; <b><u><font color="#000000">shift</font></u></b>
+ <b><u><font color="#000000">local</font></u></b> -r param_baz=<font color="#808080">"$1"</font>; <b><u><font color="#000000">shift</font></u></b>
+ <b><u><font color="#000000">local</font></u></b> -r param_bay=<font color="#808080">"$1"</font>; <b><u><font color="#000000">shift</font></u></b>
+
+ <i><font color="silver"># ...</font></i>
+}
</pre>
<br />
<span>As you can see, I didn&#39;t need to change any other assignments within the function. Of course, you would also need to change the function argument lists at every occasion where the function is invoked - you would do that within the same refactoring session.</span><br />
@@ -362,9 +362,9 @@ http://www.gnu.org/software/src-highlite -->
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
-<pre><b><font color="#00ffff">set</font></b><font color="#ffffff"> -e</font>
-<font color="#ffffff">grep -q foo </font><b><font color="#ee5896">&lt;&lt;&lt;</font></b><font color="#ffffff"> bar</font>
-<font color="#ffffff">echo Jo</font>
+<pre><b><u><font color="#000000">set</font></u></b> -e
+grep -q foo &lt;&lt;&lt; bar
+echo Jo
</pre>
<br />
<span>Here &#39;Jo&#39; will never be printed out as the grep didn&#39;t find any match. It&#39;s unrealistic for most scripts to run in paranoid mode purely, so there must be a way to add exceptions. Critical Bash scripts of mine tend to look like this:</span><br />
@@ -373,26 +373,26 @@ http://www.gnu.org/software/src-highlite -->
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
-<pre><i><font color="#00ff00">#!/usr/bin/env bash</font></i>
+<pre><i><font color="silver">#!/usr/bin/env bash</font></i>
-<b><font color="#00ffff">set</font></b><font color="#ffffff"> -e</font>
+<b><u><font color="#000000">set</font></u></b> -e
-<b><font color="#ffffff">some_function ()</font></b><font color="#ffffff"> {</font>
-<font color="#ffffff"> </font><i><font color="#00ff00"># .. some critical code</font></i>
-<font color="#ffffff"> </font><i><font color="#00ff00"># ...</font></i>
+some_function () {
+ <i><font color="silver"># .. some critical code</font></i>
+ <i><font color="silver"># ...</font></i>
-<font color="#ffffff"> </font><b><font color="#00ffff">set</font></b><font color="#ffffff"> </font><b><font color="#ee5896">+</font></b><font color="#ffffff">e</font>
-<font color="#ffffff"> </font><i><font color="#00ff00"># Grep might fail, but that's OK now</font></i>
-<font color="#ffffff"> grep </font><b><font color="#ee5896">....</font></b>
-<font color="#ffffff"> </font><b><font color="#00ffff">local</font></b><font color="#ffffff"> -i </font><font color="#ffffff">ec</font><b><font color="#ee5896">=</font></b><font color="#ffffff">$?</font>
-<font color="#ffffff"> </font><b><font color="#00ffff">set</font></b><font color="#ffffff"> -e</font>
+ <b><u><font color="#000000">set</font></u></b> +e
+ <i><font color="silver"># Grep might fail, but that's OK now</font></i>
+ grep ....
+ <b><u><font color="#000000">local</font></u></b> -i ec=$?
+ <b><u><font color="#000000">set</font></u></b> -e
-<font color="#ffffff"> </font><i><font color="#00ff00"># .. critical code continues ...</font></i>
-<font color="#ffffff"> </font><b><font color="#00ffff">if</font></b><font color="#ffffff"> </font><b><font color="#ee5896">[[</font></b><font color="#ffffff"> </font><font color="#ffffff">$ec</font><font color="#ffffff"> -ne </font><font color="#ff00ff">0</font><font color="#ffffff"> </font><b><font color="#ee5896">]];</font></b><font color="#ffffff"> </font><b><font color="#00ffff">then</font></b>
-<font color="#ffffff"> </font><b><font color="#ee5896">:</font></b><font color="#ffffff"> </font><i><font color="#00ff00"># ...</font></i>
-<font color="#ffffff"> </font><b><font color="#00ffff">fi</font></b>
-<font color="#ffffff"> </font><i><font color="#00ff00"># ...</font></i>
-<font color="#ffffff">}</font>
+ <i><font color="silver"># .. critical code continues ...</font></i>
+ <b><u><font color="#000000">if</font></u></b> [[ $ec -ne <font color="#000000">0</font> ]]; <b><u><font color="#000000">then</font></u></b>
+ : <i><font color="silver"># ...</font></i>
+ <b><u><font color="#000000">fi</font></u></b>
+ <i><font color="silver"># ...</font></i>
+}
</pre>
<br />
<h2 style='display: inline' id='learned'>Learned</h2><br />
@@ -407,10 +407,10 @@ http://www.gnu.org/software/src-highlite -->
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
-<pre><b><font color="#00ffff">if</font></b><font color="#ffffff"> </font><b><font color="#ee5896">[[</font></b><font color="#ffffff"> </font><font color="#cd00ff">"${my_var}"</font><font color="#ffffff"> </font><b><font color="#ee5896">&gt;</font></b><font color="#ffffff"> </font><font color="#ff00ff">3</font><font color="#ffffff"> </font><b><font color="#ee5896">]];</font></b><font color="#ffffff"> </font><b><font color="#00ffff">then</font></b>
-<font color="#ffffff"> </font><i><font color="#00ff00"># True for 4, false for 22.</font></i>
-<font color="#ffffff"> do_something</font>
-<b><font color="#00ffff">fi</font></b>
+<pre><b><u><font color="#000000">if</font></u></b> [[ <font color="#808080">"${my_var}"</font> &gt; <font color="#000000">3</font> ]]; <b><u><font color="#000000">then</font></u></b>
+ <i><font color="silver"># True for 4, false for 22.</font></i>
+ do_something
+<b><u><font color="#000000">fi</font></u></b>
</pre>
<br />
<span>... but it is probably an unintended lexicographical comparison. A correct way would be:</span><br />
@@ -419,9 +419,9 @@ http://www.gnu.org/software/src-highlite -->
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
-<pre><b><font color="#00ffff">if</font></b><font color="#ffffff"> </font><b><font color="#ee5896">((</font></b><font color="#ffffff"> my_var </font><b><font color="#ee5896">&gt;</font></b><font color="#ffffff"> </font><font color="#ff00ff">3</font><font color="#ffffff"> </font><b><font color="#ee5896">));</font></b><font color="#ffffff"> </font><b><font color="#00ffff">then</font></b>
-<font color="#ffffff"> do_something</font>
-<b><font color="#00ffff">fi</font></b>
+<pre><b><u><font color="#000000">if</font></u></b> (( my_var &gt; <font color="#000000">3</font> )); <b><u><font color="#000000">then</font></u></b>
+ do_something
+<b><u><font color="#000000">fi</font></u></b>
</pre>
<br />
<span>or</span><br />
@@ -430,9 +430,9 @@ http://www.gnu.org/software/src-highlite -->
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
-<pre><b><font color="#00ffff">if</font></b><font color="#ffffff"> </font><b><font color="#ee5896">[[</font></b><font color="#ffffff"> </font><font color="#cd00ff">"${my_var}"</font><font color="#ffffff"> -gt </font><font color="#ff00ff">3</font><font color="#ffffff"> </font><b><font color="#ee5896">]];</font></b><font color="#ffffff"> </font><b><font color="#00ffff">then</font></b>
-<font color="#ffffff"> do_something</font>
-<b><font color="#00ffff">fi</font></b>
+<pre><b><u><font color="#000000">if</font></u></b> [[ <font color="#808080">"${my_var}"</font> -gt <font color="#000000">3</font> ]]; <b><u><font color="#000000">then</font></u></b>
+ do_something
+<b><u><font color="#000000">fi</font></u></b>
</pre>
<br />
<h3 style='display: inline' id='pipestatus'>PIPESTATUS</h3><br />
@@ -445,10 +445,10 @@ http://www.gnu.org/software/src-highlite -->
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
-<pre><font color="#ffffff">tar -cf - </font><b><font color="#ee5896">./*</font></b><font color="#ffffff"> </font><b><font color="#ee5896">|</font></b><font color="#ffffff"> </font><b><font color="#ee5896">(</font></b><font color="#ffffff"> cd </font><font color="#cd00ff">"${dir}"</font><font color="#ffffff"> </font><b><font color="#ee5896">&amp;&amp;</font></b><font color="#ffffff"> tar -xf - </font><b><font color="#ee5896">)</font></b>
-<b><font color="#00ffff">if</font></b><font color="#ffffff"> </font><b><font color="#ee5896">((</font></b><font color="#ffffff"> PIPESTATUS</font><b><font color="#ee5896">[</font></b><font color="#ff00ff">0</font><b><font color="#ee5896">]</font></b><font color="#ffffff"> </font><b><font color="#ee5896">!=</font></b><font color="#ffffff"> </font><font color="#ff00ff">0</font><font color="#ffffff"> </font><b><font color="#ee5896">||</font></b><font color="#ffffff"> PIPESTATUS</font><b><font color="#ee5896">[</font></b><font color="#ff00ff">1</font><b><font color="#ee5896">]</font></b><font color="#ffffff"> </font><b><font color="#ee5896">!=</font></b><font color="#ffffff"> </font><font color="#ff00ff">0</font><font color="#ffffff"> </font><b><font color="#ee5896">));</font></b><font color="#ffffff"> </font><b><font color="#00ffff">then</font></b>
-<font color="#ffffff"> echo </font><font color="#cd00ff">"Unable to tar files to ${dir}"</font><font color="#ffffff"> </font><b><font color="#ee5896">&gt;&amp;</font></b><font color="#ff00ff">2</font>
-<b><font color="#00ffff">fi</font></b>
+<pre>tar -cf - ./* | ( cd <font color="#808080">"${dir}"</font> &amp;&amp; tar -xf - )
+<b><u><font color="#000000">if</font></u></b> (( PIPESTATUS[<font color="#000000">0</font>] != <font color="#000000">0</font> || PIPESTATUS[<font color="#000000">1</font>] != <font color="#000000">0</font> )); <b><u><font color="#000000">then</font></u></b>
+ echo <font color="#808080">"Unable to tar files to ${dir}"</font> &gt;&amp;<font color="#000000">2</font>
+<b><u><font color="#000000">fi</font></u></b>
</pre>
<br />
<span>However, as PIPESTATUS will be overwritten as soon as you do any other command, if you need to act differently on errors based on where it happened in the pipe, you&#39;ll need to assign PIPESTATUS to another variable immediately after running the command (don&#39;t forget that [ is a command and will wipe out PIPESTATUS).</span><br />
@@ -457,14 +457,14 @@ http://www.gnu.org/software/src-highlite -->
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
-<pre><font color="#ffffff">tar -cf - </font><b><font color="#ee5896">./*</font></b><font color="#ffffff"> </font><b><font color="#ee5896">|</font></b><font color="#ffffff"> </font><b><font color="#ee5896">(</font></b><font color="#ffffff"> cd </font><font color="#cd00ff">"${DIR}"</font><font color="#ffffff"> </font><b><font color="#ee5896">&amp;&amp;</font></b><font color="#ffffff"> tar -xf - </font><b><font color="#ee5896">)</font></b>
-<font color="#ffffff">return_codes</font><b><font color="#ee5896">=(</font></b><font color="#ffffff"> </font><font color="#cd00ff">"${PIPESTATUS[@]}"</font><font color="#ffffff"> </font><b><font color="#ee5896">)</font></b>
-<b><font color="#00ffff">if</font></b><font color="#ffffff"> </font><b><font color="#ee5896">((</font></b><font color="#ffffff"> return_codes</font><b><font color="#ee5896">[</font></b><font color="#ff00ff">0</font><b><font color="#ee5896">]</font></b><font color="#ffffff"> </font><b><font color="#ee5896">!=</font></b><font color="#ffffff"> </font><font color="#ff00ff">0</font><font color="#ffffff"> </font><b><font color="#ee5896">));</font></b><font color="#ffffff"> </font><b><font color="#00ffff">then</font></b>
-<font color="#ffffff"> do_something</font>
-<b><font color="#00ffff">fi</font></b>
-<b><font color="#00ffff">if</font></b><font color="#ffffff"> </font><b><font color="#ee5896">((</font></b><font color="#ffffff"> return_codes</font><b><font color="#ee5896">[</font></b><font color="#ff00ff">1</font><b><font color="#ee5896">]</font></b><font color="#ffffff"> </font><b><font color="#ee5896">!=</font></b><font color="#ffffff"> </font><font color="#ff00ff">0</font><font color="#ffffff"> </font><b><font color="#ee5896">));</font></b><font color="#ffffff"> </font><b><font color="#00ffff">then</font></b>
-<font color="#ffffff"> do_something_else</font>
-<b><font color="#00ffff">fi</font></b>
+<pre>tar -cf - ./* | ( cd <font color="#808080">"${DIR}"</font> &amp;&amp; tar -xf - )
+return_codes=( <font color="#808080">"${PIPESTATUS[@]}"</font> )
+<b><u><font color="#000000">if</font></u></b> (( return_codes[<font color="#000000">0</font>] != <font color="#000000">0</font> )); <b><u><font color="#000000">then</font></u></b>
+ do_something
+<b><u><font color="#000000">fi</font></u></b>
+<b><u><font color="#000000">if</font></u></b> (( return_codes[<font color="#000000">1</font>] != <font color="#000000">0</font> )); <b><u><font color="#000000">then</font></u></b>
+ do_something_else
+<b><u><font color="#000000">fi</font></u></b>
</pre>
<br />
<h2 style='display: inline' id='use-common-sense-and-be-consistent'>Use common sense and BE CONSISTENT.</h2><br />