summaryrefslogtreecommitdiff
path: root/gemfeed/2021-05-16-personal-bash-coding-style-guide.html
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2024-05-18 13:24:42 +0300
committerPaul Buetow <paul@buetow.org>2024-05-18 13:24:42 +0300
commitd4ee6684b7d6c8c8e5ff96f6998755c42465ec22 (patch)
tree3806e433616a5a291a2abbbd997e44ca06f69f1f /gemfeed/2021-05-16-personal-bash-coding-style-guide.html
parent8a4f2adf0e31c0fb453f3975e6fb830e43b7604f (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 ab1aea8c..408b3c65 100644
--- a/gemfeed/2021-05-16-personal-bash-coding-style-guide.html
+++ b/gemfeed/2021-05-16-personal-bash-coding-style-guide.html
@@ -41,7 +41,7 @@
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
-<pre><i><font color="#9A1900">#!/bin/bash </font></i>
+<pre><i><font color="#ababab">#!/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 />
@@ -50,7 +50,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="#9A1900">#!/usr/bin/env bash</font></i>
+<pre><i><font color="#ababab">#!/usr/bin/env bash</font></i>
</pre>
<br />
<h3 style='display: inline' id='Twospacesofttabsindentation'>Two space soft-tabs indentation</h3><br />
@@ -71,14 +71,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="#9A1900"># All fits on one line</font></i>
-command1 <font color="#990000">|</font> command2
+<pre><i><font color="#ababab"># All fits on one line</font></i>
+<font color="#ff0000">command1 </font><font color="#F3E651">|</font><font color="#ff0000"> command2</font>
-<i><font color="#9A1900"># Long commands</font></i>
-command1 <font color="#990000">\</font>
- <font color="#990000">|</font> command2 <font color="#990000">\</font>
- <font color="#990000">|</font> command3 <font color="#990000">\</font>
- <font color="#990000">|</font> command4
+<i><font color="#ababab"># Long commands</font></i>
+<font color="#ff0000">command1 </font><font color="#F3E651">\</font>
+<font color="#ff0000"> </font><font color="#F3E651">|</font><font color="#ff0000"> command2 </font><font color="#F3E651">\</font>
+<font color="#ff0000"> </font><font color="#F3E651">|</font><font color="#ff0000"> command3 </font><font color="#F3E651">\</font>
+<font color="#ff0000"> </font><font color="#F3E651">|</font><font color="#ff0000"> command4</font>
</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 />
@@ -87,11 +87,11 @@ command1 <font color="#990000">\</font>
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
-<pre><i><font color="#9A1900"># Long commands</font></i>
-command1 <font color="#990000">|</font>
- command2 <font color="#990000">|</font>
- command3 <font color="#990000">|</font>
- command4
+<pre><i><font color="#ababab"># Long commands</font></i>
+<font color="#ff0000">command1 </font><font color="#F3E651">|</font>
+<font color="#ff0000"> command2 </font><font color="#F3E651">|</font>
+<font color="#ff0000"> command3 </font><font color="#F3E651">|</font>
+<font color="#ff0000"> command4</font>
</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 />
@@ -104,11 +104,11 @@ command1 <font color="#990000">|</font>
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
-<pre><b><font color="#000000">greet ()</font></b> {
- <b><font color="#0000FF">local</font></b> -r <font color="#009900">greeting</font><font color="#990000">=</font><font color="#FF0000">"${1}"</font>
- <b><font color="#0000FF">local</font></b> -r <font color="#009900">name</font><font color="#990000">=</font><font color="#FF0000">"${2}"</font>
- echo <font color="#FF0000">"${greeting} ${name}!"</font>
-}
+<pre><font color="#7bc710">greet ()</font><font color="#ff0000"> {</font>
+<font color="#ff0000"> </font><b><font color="#ffffff">local</font></b><font color="#ff0000"> -r </font><font color="#ff0000">greeting</font><font color="#F3E651">=</font><font color="#bb00ff">"${1}"</font>
+<font color="#ff0000"> </font><b><font color="#ffffff">local</font></b><font color="#ff0000"> -r </font><font color="#ff0000">name</font><font color="#F3E651">=</font><font color="#bb00ff">"${2}"</font>
+<font color="#ff0000"> echo </font><font color="#bb00ff">"${greeting} ${name}!"</font>
+<font color="#ff0000">}</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 />
@@ -117,11 +117,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="#000000">say_hello_to_paul ()</font></b> {
- <b><font color="#0000FF">local</font></b> -r <font color="#009900">greeting</font><font color="#990000">=</font>Hello
- <b><font color="#0000FF">local</font></b> -r <font color="#009900">name</font><font color="#990000">=</font>Paul
- echo <font color="#FF0000">"$greeting $name!"</font>
-}
+<pre><font color="#7bc710">say_hello_to_paul ()</font><font color="#ff0000"> {</font>
+<font color="#ff0000"> </font><b><font color="#ffffff">local</font></b><font color="#ff0000"> -r </font><font color="#ff0000">greeting</font><font color="#F3E651">=</font><font color="#ff0000">Hello</font>
+<font color="#ff0000"> </font><b><font color="#ffffff">local</font></b><font color="#ff0000"> -r </font><font color="#ff0000">name</font><font color="#F3E651">=</font><font color="#ff0000">Paul</font>
+<font color="#ff0000"> echo </font><font color="#bb00ff">"$greeting $name!"</font>
+<font color="#ff0000">}</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 />
@@ -130,9 +130,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="#0000FF">declare</font></b> <font color="#009900">FOO</font><font color="#990000">=</font>bar
-<i><font color="#9A1900"># Curly braces around FOO are necessary</font></i>
-echo <font color="#FF0000">"foo${FOO}baz"</font>
+<pre><b><font color="#ffffff">declare</font></b><font color="#ff0000"> </font><font color="#ff0000">FOO</font><font color="#F3E651">=</font><font color="#ff0000">bar</font>
+<i><font color="#ababab"># Curly braces around FOO are necessary</font></i>
+<font color="#ff0000">echo </font><font color="#bb00ff">"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 />
@@ -145,13 +145,13 @@ echo <font color="#FF0000">"foo${FOO}baz"</font>
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
-<pre><i><font color="#9A1900"># Prefer this:</font></i>
-<font color="#009900">addition</font><font color="#990000">=</font><font color="#009900">$(</font><font color="#990000">(</font> X <font color="#990000">+</font> Y <font color="#990000">))</font>
-<font color="#009900">substitution</font><font color="#990000">=</font><font color="#FF0000">"${string/#foo/bar}"</font>
+<pre><i><font color="#ababab"># Prefer this:</font></i>
+<font color="#ff0000">addition</font><font color="#F3E651">=</font><font color="#ff0000">$(</font><font color="#F3E651">(</font><font color="#ff0000"> X </font><font color="#F3E651">+</font><font color="#ff0000"> Y </font><font color="#F3E651">))</font>
+<font color="#ff0000">substitution</font><font color="#F3E651">=</font><font color="#bb00ff">"${string/#foo/bar}"</font>
-<i><font color="#9A1900"># Instead of this:</font></i>
-<font color="#009900">addition</font><font color="#990000">=</font><font color="#FF0000">"$(expr "</font><font color="#009900">${X}</font><font color="#FF0000">" + "</font><font color="#009900">${Y}</font><font color="#FF0000">")"</font>
-<font color="#009900">substitution</font><font color="#990000">=</font><font color="#FF0000">"$(echo "</font><font color="#009900">${string}</font><font color="#FF0000">" | sed -e 's/^foo/bar/')"</font>
+<i><font color="#ababab"># Instead of this:</font></i>
+<font color="#ff0000">addition</font><font color="#F3E651">=</font><font color="#bb00ff">"$(expr "</font><font color="#ff0000">${X}</font><font color="#bb00ff">" + "</font><font color="#ff0000">${Y}</font><font color="#bb00ff">")"</font>
+<font color="#ff0000">substitution</font><font color="#F3E651">=</font><font color="#bb00ff">"$(echo "</font><font color="#ff0000">${string}</font><font color="#bb00ff">" | 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 />
@@ -172,20 +172,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="#0000FF">declare</font></b> -r <font color="#009900">SUGAR_FREE</font><font color="#990000">=</font>yes
-<b><font color="#0000FF">declare</font></b> -r <font color="#009900">I_NEED_THE_BUZZ</font><font color="#990000">=</font>no
+<pre><b><font color="#ffffff">declare</font></b><font color="#ff0000"> -r </font><font color="#ff0000">SUGAR_FREE</font><font color="#F3E651">=</font><font color="#ff0000">yes</font>
+<b><font color="#ffffff">declare</font></b><font color="#ff0000"> -r </font><font color="#ff0000">I_NEED_THE_BUZZ</font><font color="#F3E651">=</font><font color="#ff0000">no</font>
-<b><font color="#000000">buy_soda ()</font></b> {
- <b><font color="#0000FF">local</font></b> -r <font color="#009900">sugar_free</font><font color="#990000">=</font><font color="#009900">$1</font>
+<font color="#7bc710">buy_soda ()</font><font color="#ff0000"> {</font>
+<font color="#ff0000"> </font><b><font color="#ffffff">local</font></b><font color="#ff0000"> -r </font><font color="#ff0000">sugar_free</font><font color="#F3E651">=</font><font color="#ff0000">$1</font>
- <b><font color="#0000FF">if</font></b> <font color="#990000">[[</font> <font color="#009900">$sugar_free</font> <font color="#990000">==</font> yes <font color="#990000">]];</font> <b><font color="#0000FF">then</font></b>
- echo <font color="#FF0000">'Diet Dr. Pepper'</font>
- <b><font color="#0000FF">else</font></b>
- echo <font color="#FF0000">'Pepsi Coke'</font>
- <b><font color="#0000FF">fi</font></b>
-}
+<font color="#ff0000"> </font><b><font color="#ffffff">if</font></b><font color="#ff0000"> </font><font color="#F3E651">[[</font><font color="#ff0000"> </font><font color="#ff0000">$sugar_free</font><font color="#ff0000"> </font><font color="#F3E651">==</font><font color="#ff0000"> yes </font><font color="#F3E651">]];</font><font color="#ff0000"> </font><b><font color="#ffffff">then</font></b>
+<font color="#ff0000"> echo </font><font color="#bb00ff">'Diet Dr. Pepper'</font>
+<font color="#ff0000"> </font><b><font color="#ffffff">else</font></b>
+<font color="#ff0000"> echo </font><font color="#bb00ff">'Pepsi Coke'</font>
+<font color="#ff0000"> </font><b><font color="#ffffff">fi</font></b>
+<font color="#ff0000">}</font>
-buy_soda <font color="#009900">$I_NEED_THE_BUZZ</font>
+<font color="#ff0000">buy_soda </font><font color="#ff0000">$I_NEED_THE_BUZZ</font>
</pre>
<br />
<h3 style='display: inline' id='Nonevilalternativetovariableassignmentsviaeval'>Non-evil alternative to variable assignments via eval</h3><br />
@@ -196,12 +196,12 @@ buy_soda <font color="#009900">$I_NEED_THE_BUZZ</font>
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
-<pre><i><font color="#9A1900"># What does this set?</font></i>
-<i><font color="#9A1900"># Did it succeed? In part or whole?</font></i>
-<b><font color="#0000FF">eval</font></b> <font color="#009900">$(set_my_variables)</font>
+<pre><i><font color="#ababab"># What does this set?</font></i>
+<i><font color="#ababab"># Did it succeed? In part or whole?</font></i>
+<b><font color="#ffffff">eval</font></b><font color="#ff0000"> </font><font color="#ff0000">$(set_my_variables)</font>
-<i><font color="#9A1900"># What happens if one of the returned values has a space in it?</font></i>
-<font color="#009900">variable</font><font color="#990000">=</font><font color="#FF0000">"$(eval some_function)"</font>
+<i><font color="#ababab"># What happens if one of the returned values has a space in it?</font></i>
+<font color="#ff0000">variable</font><font color="#F3E651">=</font><font color="#bb00ff">"$(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 />
@@ -240,39 +240,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="#000000">filter_lines ()</font></b> {
- echo <font color="#FF0000">'Start filtering lines in a fancy way!'</font> <font color="#990000">&gt;&amp;</font><font color="#993399">2</font>
- grep <font color="#990000">...</font> <font color="#990000">|</font> sed <font color="#990000">....</font>
-}
+<pre><font color="#7bc710">filter_lines ()</font><font color="#ff0000"> {</font>
+<font color="#ff0000"> echo </font><font color="#bb00ff">'Start filtering lines in a fancy way!'</font><font color="#ff0000"> </font><font color="#F3E651">&gt;&amp;</font><font color="#bb00ff">2</font>
+<font color="#ff0000"> grep </font><font color="#F3E651">...</font><font color="#ff0000"> </font><font color="#F3E651">|</font><font color="#ff0000"> sed </font><font color="#F3E651">....</font>
+<font color="#ff0000">}</font>
-<b><font color="#000000">process_lines ()</font></b> {
- echo <font color="#FF0000">'Start processing line by line!'</font> <font color="#990000">&gt;&amp;</font><font color="#993399">2</font>
- <b><font color="#0000FF">while</font></b> <b><font color="#0000FF">read</font></b> -r line<font color="#990000">;</font> <b><font color="#0000FF">do</font></b>
- <font color="#990000">...</font> <b><font color="#0000FF">do</font></b> something and produce a result<font color="#990000">...</font>
- echo <font color="#FF0000">"$result"</font>
- <b><font color="#0000FF">done</font></b>
-}
+<font color="#7bc710">process_lines ()</font><font color="#ff0000"> {</font>
+<font color="#ff0000"> echo </font><font color="#bb00ff">'Start processing line by line!'</font><font color="#ff0000"> </font><font color="#F3E651">&gt;&amp;</font><font color="#bb00ff">2</font>
+<font color="#ff0000"> </font><b><font color="#ffffff">while</font></b><font color="#ff0000"> </font><b><font color="#ffffff">read</font></b><font color="#ff0000"> -r line</font><font color="#F3E651">;</font><font color="#ff0000"> </font><b><font color="#ffffff">do</font></b>
+<font color="#ff0000"> </font><font color="#F3E651">...</font><font color="#ff0000"> </font><b><font color="#ffffff">do</font></b><font color="#ff0000"> something and produce a result</font><font color="#F3E651">...</font>
+<font color="#ff0000"> echo </font><font color="#bb00ff">"$result"</font>
+<font color="#ff0000"> </font><b><font color="#ffffff">done</font></b><font color="#ff0000"> </font>
+<font color="#ff0000">}</font>
-<i><font color="#9A1900"># Do some post-processing of the data</font></i>
-<b><font color="#000000">postprocess_lines ()</font></b> {
- echo <font color="#FF0000">'Start removing duplicates!'</font> <font color="#990000">&gt;&amp;</font><font color="#993399">2</font>
- sort -u
-}
+<i><font color="#ababab"># Do some post-processing of the data</font></i>
+<font color="#7bc710">postprocess_lines ()</font><font color="#ff0000"> {</font>
+<font color="#ff0000"> echo </font><font color="#bb00ff">'Start removing duplicates!'</font><font color="#ff0000"> </font><font color="#F3E651">&gt;&amp;</font><font color="#bb00ff">2</font>
+<font color="#ff0000"> sort -u</font>
+<font color="#ff0000">}</font>
-<b><font color="#000000">genreate_report ()</font></b> {
- echo <font color="#FF0000">'My boss wants to have a report!'</font> <font color="#990000">&gt;&amp;</font><font color="#993399">2</font>
- tee outfile<font color="#990000">.</font>txt
- wc -l outfile<font color="#990000">.</font>txt
-}
+<font color="#7bc710">genreate_report ()</font><font color="#ff0000"> {</font>
+<font color="#ff0000"> echo </font><font color="#bb00ff">'My boss wants to have a report!'</font><font color="#ff0000"> </font><font color="#F3E651">&gt;&amp;</font><font color="#bb00ff">2</font>
+<font color="#ff0000"> tee outfile</font><font color="#F3E651">.</font><font color="#ff0000">txt</font>
+<font color="#ff0000"> wc -l outfile</font><font color="#F3E651">.</font><font color="#ff0000">txt</font>
+<font color="#ff0000">}</font>
-<b><font color="#000000">main ()</font></b> {
- filter_lines <font color="#990000">|</font>
- process_lines <font color="#990000">|</font>
- postprocess_lines <font color="#990000">|</font>
- generate_report
-}
+<font color="#7bc710">main ()</font><font color="#ff0000"> {</font>
+<font color="#ff0000"> filter_lines </font><font color="#F3E651">|</font>
+<font color="#ff0000"> process_lines </font><font color="#F3E651">|</font>
+<font color="#ff0000"> postprocess_lines </font><font color="#F3E651">|</font>
+<font color="#ff0000"> generate_report</font>
+<font color="#ff0000">}</font>
-main
+<font color="#ff0000">main</font>
</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 />
@@ -287,13 +287,13 @@ main
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
-<pre><b><font color="#000000">some_function ()</font></b> {
- <b><font color="#0000FF">local</font></b> -r <font color="#009900">param_foo</font><font color="#990000">=</font><font color="#FF0000">"$1"</font><font color="#990000">;</font> <b><font color="#0000FF">shift</font></b>
- <b><font color="#0000FF">local</font></b> -r <font color="#009900">param_baz</font><font color="#990000">=</font><font color="#FF0000">"$1"</font><font color="#990000">;</font> <b><font color="#0000FF">shift</font></b>
- <b><font color="#0000FF">local</font></b> -r <font color="#009900">param_bay</font><font color="#990000">=</font><font color="#FF0000">"$1"</font><font color="#990000">;</font> <b><font color="#0000FF">shift</font></b>
+<pre><font color="#7bc710">some_function ()</font><font color="#ff0000"> {</font>
+<font color="#ff0000"> </font><b><font color="#ffffff">local</font></b><font color="#ff0000"> -r </font><font color="#ff0000">param_foo</font><font color="#F3E651">=</font><font color="#bb00ff">"$1"</font><font color="#F3E651">;</font><font color="#ff0000"> </font><b><font color="#ffffff">shift</font></b>
+<font color="#ff0000"> </font><b><font color="#ffffff">local</font></b><font color="#ff0000"> -r </font><font color="#ff0000">param_baz</font><font color="#F3E651">=</font><font color="#bb00ff">"$1"</font><font color="#F3E651">;</font><font color="#ff0000"> </font><b><font color="#ffffff">shift</font></b>
+<font color="#ff0000"> </font><b><font color="#ffffff">local</font></b><font color="#ff0000"> -r </font><font color="#ff0000">param_bay</font><font color="#F3E651">=</font><font color="#bb00ff">"$1"</font><font color="#F3E651">;</font><font color="#ff0000"> </font><b><font color="#ffffff">shift</font></b>
- <i><font color="#9A1900"># ...</font></i>
-}
+<font color="#ff0000"> </font><i><font color="#ababab"># ...</font></i>
+<font color="#ff0000">}</font>
</pre>
<br />
<span>Want to add a param_baz? Just do this:</span><br />
@@ -302,14 +302,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="#000000">some_function ()</font></b> {
- <b><font color="#0000FF">local</font></b> -r <font color="#009900">param_foo</font><font color="#990000">=</font><font color="#FF0000">"$1"</font><font color="#990000">;</font> <b><font color="#0000FF">shift</font></b>
- <b><font color="#0000FF">local</font></b> -r <font color="#009900">param_bar</font><font color="#990000">=</font><font color="#FF0000">"$1"</font><font color="#990000">;</font> <b><font color="#0000FF">shift</font></b>
- <b><font color="#0000FF">local</font></b> -r <font color="#009900">param_baz</font><font color="#990000">=</font><font color="#FF0000">"$1"</font><font color="#990000">;</font> <b><font color="#0000FF">shift</font></b>
- <b><font color="#0000FF">local</font></b> -r <font color="#009900">param_bay</font><font color="#990000">=</font><font color="#FF0000">"$1"</font><font color="#990000">;</font> <b><font color="#0000FF">shift</font></b>
+<pre><font color="#7bc710">some_function ()</font><font color="#ff0000"> {</font>
+<font color="#ff0000"> </font><b><font color="#ffffff">local</font></b><font color="#ff0000"> -r </font><font color="#ff0000">param_foo</font><font color="#F3E651">=</font><font color="#bb00ff">"$1"</font><font color="#F3E651">;</font><font color="#ff0000"> </font><b><font color="#ffffff">shift</font></b>
+<font color="#ff0000"> </font><b><font color="#ffffff">local</font></b><font color="#ff0000"> -r </font><font color="#ff0000">param_bar</font><font color="#F3E651">=</font><font color="#bb00ff">"$1"</font><font color="#F3E651">;</font><font color="#ff0000"> </font><b><font color="#ffffff">shift</font></b>
+<font color="#ff0000"> </font><b><font color="#ffffff">local</font></b><font color="#ff0000"> -r </font><font color="#ff0000">param_baz</font><font color="#F3E651">=</font><font color="#bb00ff">"$1"</font><font color="#F3E651">;</font><font color="#ff0000"> </font><b><font color="#ffffff">shift</font></b>
+<font color="#ff0000"> </font><b><font color="#ffffff">local</font></b><font color="#ff0000"> -r </font><font color="#ff0000">param_bay</font><font color="#F3E651">=</font><font color="#bb00ff">"$1"</font><font color="#F3E651">;</font><font color="#ff0000"> </font><b><font color="#ffffff">shift</font></b>
- <i><font color="#9A1900"># ...</font></i>
-}
+<font color="#ff0000"> </font><i><font color="#ababab"># ...</font></i>
+<font color="#ff0000">}</font>
</pre>
<br />
<span>Want to remove param_foo? Nothing easier than that:</span><br />
@@ -318,13 +318,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="#000000">some_function ()</font></b> {
- <b><font color="#0000FF">local</font></b> -r <font color="#009900">param_bar</font><font color="#990000">=</font><font color="#FF0000">"$1"</font><font color="#990000">;</font> <b><font color="#0000FF">shift</font></b>
- <b><font color="#0000FF">local</font></b> -r <font color="#009900">param_baz</font><font color="#990000">=</font><font color="#FF0000">"$1"</font><font color="#990000">;</font> <b><font color="#0000FF">shift</font></b>
- <b><font color="#0000FF">local</font></b> -r <font color="#009900">param_bay</font><font color="#990000">=</font><font color="#FF0000">"$1"</font><font color="#990000">;</font> <b><font color="#0000FF">shift</font></b>
-
- <i><font color="#9A1900"># ...</font></i>
-}
+<pre><font color="#7bc710">some_function ()</font><font color="#ff0000"> {</font>
+<font color="#ff0000"> </font><b><font color="#ffffff">local</font></b><font color="#ff0000"> -r </font><font color="#ff0000">param_bar</font><font color="#F3E651">=</font><font color="#bb00ff">"$1"</font><font color="#F3E651">;</font><font color="#ff0000"> </font><b><font color="#ffffff">shift</font></b>
+<font color="#ff0000"> </font><b><font color="#ffffff">local</font></b><font color="#ff0000"> -r </font><font color="#ff0000">param_baz</font><font color="#F3E651">=</font><font color="#bb00ff">"$1"</font><font color="#F3E651">;</font><font color="#ff0000"> </font><b><font color="#ffffff">shift</font></b>
+<font color="#ff0000"> </font><b><font color="#ffffff">local</font></b><font color="#ff0000"> -r </font><font color="#ff0000">param_bay</font><font color="#F3E651">=</font><font color="#bb00ff">"$1"</font><font color="#F3E651">;</font><font color="#ff0000"> </font><b><font color="#ffffff">shift</font></b>
+<font color="#ff0000"> </font>
+<font color="#ff0000"> </font><i><font color="#ababab"># ...</font></i>
+<font color="#ff0000">}</font>
</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 />
@@ -337,9 +337,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="#0000FF">set</font></b> -e
-grep -q foo <font color="#990000">&lt;&lt;&lt;</font> bar
-echo Jo
+<pre><b><font color="#ffffff">set</font></b><font color="#ff0000"> -e</font>
+<font color="#ff0000">grep -q foo </font><font color="#F3E651">&lt;&lt;&lt;</font><font color="#ff0000"> bar</font>
+<font color="#ff0000">echo Jo</font>
</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 />
@@ -348,26 +348,26 @@ echo Jo
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
-<pre><i><font color="#9A1900">#!/usr/bin/env bash</font></i>
+<pre><i><font color="#ababab">#!/usr/bin/env bash</font></i>
-<b><font color="#0000FF">set</font></b> -e
+<b><font color="#ffffff">set</font></b><font color="#ff0000"> -e</font>
-<b><font color="#000000">some_function ()</font></b> {
- <i><font color="#9A1900"># .. some critical code</font></i>
- <i><font color="#9A1900"># ...</font></i>
+<font color="#7bc710">some_function ()</font><font color="#ff0000"> {</font>
+<font color="#ff0000"> </font><i><font color="#ababab"># .. some critical code</font></i>
+<font color="#ff0000"> </font><i><font color="#ababab"># ...</font></i>
- <b><font color="#0000FF">set</font></b> <font color="#990000">+</font>e
- <i><font color="#9A1900"># Grep might fail, but that's OK now</font></i>
- grep <font color="#990000">....</font>
- <b><font color="#0000FF">local</font></b> -i <font color="#009900">ec</font><font color="#990000">=</font><font color="#009900">$?</font>
- <b><font color="#0000FF">set</font></b> -e
+<font color="#ff0000"> </font><b><font color="#ffffff">set</font></b><font color="#ff0000"> </font><font color="#F3E651">+</font><font color="#ff0000">e</font>
+<font color="#ff0000"> </font><i><font color="#ababab"># Grep might fail, but that's OK now</font></i>
+<font color="#ff0000"> grep </font><font color="#F3E651">....</font>
+<font color="#ff0000"> </font><b><font color="#ffffff">local</font></b><font color="#ff0000"> -i </font><font color="#ff0000">ec</font><font color="#F3E651">=</font><font color="#ff0000">$?</font>
+<font color="#ff0000"> </font><b><font color="#ffffff">set</font></b><font color="#ff0000"> -e</font>
- <i><font color="#9A1900"># .. critical code continues ...</font></i>
- <b><font color="#0000FF">if</font></b> <font color="#990000">[[</font> <font color="#009900">$ec</font> -ne <font color="#993399">0</font> <font color="#990000">]];</font> <b><font color="#0000FF">then</font></b>
- <font color="#990000">:</font> <i><font color="#9A1900"># ...</font></i>
- <b><font color="#0000FF">fi</font></b>
- <i><font color="#9A1900"># ...</font></i>
-}
+<font color="#ff0000"> </font><i><font color="#ababab"># .. critical code continues ...</font></i>
+<font color="#ff0000"> </font><b><font color="#ffffff">if</font></b><font color="#ff0000"> </font><font color="#F3E651">[[</font><font color="#ff0000"> </font><font color="#ff0000">$ec</font><font color="#ff0000"> -ne </font><font color="#bb00ff">0</font><font color="#ff0000"> </font><font color="#F3E651">]];</font><font color="#ff0000"> </font><b><font color="#ffffff">then</font></b>
+<font color="#ff0000"> </font><font color="#F3E651">:</font><font color="#ff0000"> </font><i><font color="#ababab"># ...</font></i>
+<font color="#ff0000"> </font><b><font color="#ffffff">fi</font></b>
+<font color="#ff0000"> </font><i><font color="#ababab"># ...</font></i>
+<font color="#ff0000">}</font>
</pre>
<br />
<h2 style='display: inline' id='Learned'>Learned</h2><br />
@@ -382,10 +382,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="#0000FF">if</font></b> <font color="#990000">[[</font> <font color="#FF0000">"${my_var}"</font> <font color="#990000">&gt;</font> <font color="#993399">3</font> <font color="#990000">]];</font> <b><font color="#0000FF">then</font></b>
- <i><font color="#9A1900"># True for 4, false for 22.</font></i>
- do_something
-<b><font color="#0000FF">fi</font></b>
+<pre><b><font color="#ffffff">if</font></b><font color="#ff0000"> </font><font color="#F3E651">[[</font><font color="#ff0000"> </font><font color="#bb00ff">"${my_var}"</font><font color="#ff0000"> </font><font color="#F3E651">&gt;</font><font color="#ff0000"> </font><font color="#bb00ff">3</font><font color="#ff0000"> </font><font color="#F3E651">]];</font><font color="#ff0000"> </font><b><font color="#ffffff">then</font></b>
+<font color="#ff0000"> </font><i><font color="#ababab"># True for 4, false for 22.</font></i>
+<font color="#ff0000"> do_something</font>
+<b><font color="#ffffff">fi</font></b>
</pre>
<br />
<span>... but it is probably an unintended lexicographical comparison. A correct way would be:</span><br />
@@ -394,9 +394,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="#0000FF">if</font></b> <font color="#990000">((</font> my_var <font color="#990000">&gt;</font> <font color="#993399">3</font> <font color="#990000">));</font> <b><font color="#0000FF">then</font></b>
- do_something
-<b><font color="#0000FF">fi</font></b>
+<pre><b><font color="#ffffff">if</font></b><font color="#ff0000"> </font><font color="#F3E651">((</font><font color="#ff0000"> my_var </font><font color="#F3E651">&gt;</font><font color="#ff0000"> </font><font color="#bb00ff">3</font><font color="#ff0000"> </font><font color="#F3E651">));</font><font color="#ff0000"> </font><b><font color="#ffffff">then</font></b>
+<font color="#ff0000"> do_something</font>
+<b><font color="#ffffff">fi</font></b>
</pre>
<br />
<span>or</span><br />
@@ -405,9 +405,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="#0000FF">if</font></b> <font color="#990000">[[</font> <font color="#FF0000">"${my_var}"</font> -gt <font color="#993399">3</font> <font color="#990000">]];</font> <b><font color="#0000FF">then</font></b>
- do_something
-<b><font color="#0000FF">fi</font></b>
+<pre><b><font color="#ffffff">if</font></b><font color="#ff0000"> </font><font color="#F3E651">[[</font><font color="#ff0000"> </font><font color="#bb00ff">"${my_var}"</font><font color="#ff0000"> -gt </font><font color="#bb00ff">3</font><font color="#ff0000"> </font><font color="#F3E651">]];</font><font color="#ff0000"> </font><b><font color="#ffffff">then</font></b>
+<font color="#ff0000"> do_something</font>
+<b><font color="#ffffff">fi</font></b>
</pre>
<br />
<h3 style='display: inline' id='PIPESTATUS'>PIPESTATUS</h3><br />
@@ -420,10 +420,10 @@ http://www.gnu.org/software/src-highlite -->
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
-<pre>tar -cf - <font color="#990000">./*</font> <font color="#990000">|</font> <font color="#990000">(</font> cd <font color="#FF0000">"${dir}"</font> <font color="#990000">&amp;&amp;</font> tar -xf - <font color="#990000">)</font>
-<b><font color="#0000FF">if</font></b> <font color="#990000">((</font> PIPESTATUS<font color="#990000">[</font><font color="#993399">0</font><font color="#990000">]</font> <font color="#990000">!=</font> <font color="#993399">0</font> <font color="#990000">||</font> PIPESTATUS<font color="#990000">[</font><font color="#993399">1</font><font color="#990000">]</font> <font color="#990000">!=</font> <font color="#993399">0</font> <font color="#990000">));</font> <b><font color="#0000FF">then</font></b>
- echo <font color="#FF0000">"Unable to tar files to ${dir}"</font> <font color="#990000">&gt;&amp;</font><font color="#993399">2</font>
-<b><font color="#0000FF">fi</font></b>
+<pre><font color="#ff0000">tar -cf - </font><font color="#F3E651">./*</font><font color="#ff0000"> </font><font color="#F3E651">|</font><font color="#ff0000"> </font><font color="#F3E651">(</font><font color="#ff0000"> cd </font><font color="#bb00ff">"${dir}"</font><font color="#ff0000"> </font><font color="#F3E651">&amp;&amp;</font><font color="#ff0000"> tar -xf - </font><font color="#F3E651">)</font>
+<b><font color="#ffffff">if</font></b><font color="#ff0000"> </font><font color="#F3E651">((</font><font color="#ff0000"> PIPESTATUS</font><font color="#F3E651">[</font><font color="#bb00ff">0</font><font color="#F3E651">]</font><font color="#ff0000"> </font><font color="#F3E651">!=</font><font color="#ff0000"> </font><font color="#bb00ff">0</font><font color="#ff0000"> </font><font color="#F3E651">||</font><font color="#ff0000"> PIPESTATUS</font><font color="#F3E651">[</font><font color="#bb00ff">1</font><font color="#F3E651">]</font><font color="#ff0000"> </font><font color="#F3E651">!=</font><font color="#ff0000"> </font><font color="#bb00ff">0</font><font color="#ff0000"> </font><font color="#F3E651">));</font><font color="#ff0000"> </font><b><font color="#ffffff">then</font></b>
+<font color="#ff0000"> echo </font><font color="#bb00ff">"Unable to tar files to ${dir}"</font><font color="#ff0000"> </font><font color="#F3E651">&gt;&amp;</font><font color="#bb00ff">2</font>
+<b><font color="#ffffff">fi</font></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 />
@@ -432,14 +432,14 @@ http://www.gnu.org/software/src-highlite -->
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
-<pre>tar -cf - <font color="#990000">./*</font> <font color="#990000">|</font> <font color="#990000">(</font> cd <font color="#FF0000">"${DIR}"</font> <font color="#990000">&amp;&amp;</font> tar -xf - <font color="#990000">)</font>
-<font color="#009900">return_codes</font><font color="#990000">=(</font> <font color="#FF0000">"${PIPESTATUS[@]}"</font> <font color="#990000">)</font>
-<b><font color="#0000FF">if</font></b> <font color="#990000">((</font> return_codes<font color="#990000">[</font><font color="#993399">0</font><font color="#990000">]</font> <font color="#990000">!=</font> <font color="#993399">0</font> <font color="#990000">));</font> <b><font color="#0000FF">then</font></b>
- do_something
-<b><font color="#0000FF">fi</font></b>
-<b><font color="#0000FF">if</font></b> <font color="#990000">((</font> return_codes<font color="#990000">[</font><font color="#993399">1</font><font color="#990000">]</font> <font color="#990000">!=</font> <font color="#993399">0</font> <font color="#990000">));</font> <b><font color="#0000FF">then</font></b>
- do_something_else
-<b><font color="#0000FF">fi</font></b>
+<pre><font color="#ff0000">tar -cf - </font><font color="#F3E651">./*</font><font color="#ff0000"> </font><font color="#F3E651">|</font><font color="#ff0000"> </font><font color="#F3E651">(</font><font color="#ff0000"> cd </font><font color="#bb00ff">"${DIR}"</font><font color="#ff0000"> </font><font color="#F3E651">&amp;&amp;</font><font color="#ff0000"> tar -xf - </font><font color="#F3E651">)</font>
+<font color="#ff0000">return_codes</font><font color="#F3E651">=(</font><font color="#ff0000"> </font><font color="#bb00ff">"${PIPESTATUS[@]}"</font><font color="#ff0000"> </font><font color="#F3E651">)</font>
+<b><font color="#ffffff">if</font></b><font color="#ff0000"> </font><font color="#F3E651">((</font><font color="#ff0000"> return_codes</font><font color="#F3E651">[</font><font color="#bb00ff">0</font><font color="#F3E651">]</font><font color="#ff0000"> </font><font color="#F3E651">!=</font><font color="#ff0000"> </font><font color="#bb00ff">0</font><font color="#ff0000"> </font><font color="#F3E651">));</font><font color="#ff0000"> </font><b><font color="#ffffff">then</font></b>
+<font color="#ff0000"> do_something</font>
+<b><font color="#ffffff">fi</font></b>
+<b><font color="#ffffff">if</font></b><font color="#ff0000"> </font><font color="#F3E651">((</font><font color="#ff0000"> return_codes</font><font color="#F3E651">[</font><font color="#bb00ff">1</font><font color="#F3E651">]</font><font color="#ff0000"> </font><font color="#F3E651">!=</font><font color="#ff0000"> </font><font color="#bb00ff">0</font><font color="#ff0000"> </font><font color="#F3E651">));</font><font color="#ff0000"> </font><b><font color="#ffffff">then</font></b>
+<font color="#ff0000"> do_something_else</font>
+<b><font color="#ffffff">fi</font></b>
</pre>
<br />
<h2 style='display: inline' id='UsecommonsenseandBECONSISTENT'>Use common sense and BE CONSISTENT.</h2><br />