diff options
| author | Paul Buetow <paul@buetow.org> | 2026-03-08 18:17:20 +0200 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-03-08 18:17:20 +0200 |
| commit | 8a78337ea4dcb0b154bd1c754218ca01c8f9015d (patch) | |
| tree | 2501c4ab66bffff5bc443553e769bedd9f035b33 /gemfeed/2021-05-16-personal-bash-coding-style-guide.html | |
| parent | a37a644c48e824796989d532cefa564e7a3c89c1 (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.html | 294 |
1 files changed, 150 insertions, 144 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 3a832d5b..2026ef35 100644 --- a/gemfeed/2021-05-16-personal-bash-coding-style-guide.html +++ b/gemfeed/2021-05-16-personal-bash-coding-style-guide.html @@ -2,12 +2,17 @@ <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Personal Bash coding style guide</title> <link rel="shortcut icon" type="image/gif" href="/favicon.ico" /> <link rel="stylesheet" href="../style.css" /> <link rel="stylesheet" href="style-override.css" /> </head> -<body> +<body class="rfx-boot"> +<div class="rfx-overlay-grid"></div> +<div class="rfx-overlay-scanlines"></div> +<div id="rfx-stars"></div> +<div class="rfx-vignette"></div> <p class="header"> <a href="https://foo.zone">Home</a> | <a href="https://codeberg.org/snonux/foo.zone/src/branch/content-md/gemfeed/2021-05-16-personal-bash-coding-style-guide.md">Markdown</a> | <a href="gemini://foo.zone/gemfeed/2021-05-16-personal-bash-coding-style-guide.gmi">Gemini</a> </p> @@ -66,7 +71,7 @@ by Lorenzo Bettini http://www.lorenzobettini.it http://www.gnu.org/software/src-highlite --> -<pre><i><font color="silver">#!/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't have Bash installed to /bin/bash). Better is:</span><br /> @@ -75,7 +80,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="silver">#!/usr/bin/env bash</font></i> +<pre><i><font color="#ababab">#!/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 +101,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="silver"># All fits on one line</font></i> -command1 | 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="silver"># Long commands</font></i> -command1 \ - | command2 \ - | command3 \ - | 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 /> @@ -112,11 +117,11 @@ command1 \ by Lorenzo Bettini http://www.lorenzobettini.it http://www.gnu.org/software/src-highlite --> -<pre><i><font color="silver"># Long commands</font></i> -command1 | - command2 | - command3 | - 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's 2023 now, and I have changed my mind. I think Google'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 +134,11 @@ command1 | by Lorenzo Bettini http://www.lorenzobettini.it http://www.gnu.org/software/src-highlite --> -<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><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'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 +147,11 @@ http://www.gnu.org/software/src-highlite --> by Lorenzo Bettini http://www.lorenzobettini.it http://www.gnu.org/software/src-highlite --> -<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><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 /> @@ -155,9 +160,9 @@ http://www.gnu.org/software/src-highlite --> by Lorenzo Bettini http://www.lorenzobettini.it http://www.gnu.org/software/src-highlite --> -<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><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's because it will be more likely that you might not remember that some of the functions don't work on values with spaces in them, for example. It's just that I won't quote everything in every small script I write. </span><br /> @@ -170,13 +175,13 @@ echo <font color="#808080">"foo${FOO}baz"</font> by Lorenzo Bettini http://www.lorenzobettini.it http://www.gnu.org/software/src-highlite --> -<pre><i><font color="silver"># Prefer this:</font></i> -addition=$(( X + Y )) -substitution=<font color="#808080">"${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="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> +<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'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 +202,20 @@ substitution=<font color="#808080">"$(echo "</font>${string}<font color="#808080 by Lorenzo Bettini http://www.lorenzobettini.it http://www.gnu.org/software/src-highlite --> -<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 +<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> -buy_soda () { - <b><u><font color="#000000">local</font></u></b> -r sugar_free=$1 +<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><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="#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 $I_NEED_THE_BUZZ +<font color="#ff0000">buy_soda </font><font color="#ff0000">$I_NEED_THE_BUZZ</font> </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 +226,12 @@ buy_soda $I_NEED_THE_BUZZ by Lorenzo Bettini http://www.lorenzobettini.it http://www.gnu.org/software/src-highlite --> -<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) +<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="silver"># What happens if one of the returned values has a space in it?</font></i> -variable=<font color="#808080">"$(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't have to use eval here. I only have to source the file:</span><br /> @@ -265,39 +270,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>filter_lines () { - echo <font color="#808080">'Start filtering lines in a fancy way!'</font> >&<font color="#000000">2</font> - grep ... | sed .... -} +<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">>&</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> -process_lines () { - echo <font color="#808080">'Start processing line by line!'</font> >&<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> -} +<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">>&</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="silver"># Do some post-processing of the data</font></i> -postprocess_lines () { - echo <font color="#808080">'Start removing duplicates!'</font> >&<font color="#000000">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">>&</font><font color="#bb00ff">2</font> +<font color="#ff0000"> sort -u</font> +<font color="#ff0000">}</font> -genreate_report () { - echo <font color="#808080">'My boss wants to have a report!'</font> >&<font color="#000000">2</font> - tee outfile.txt - wc -l outfile.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">>&</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> -main () { - filter_lines | - process_lines | - postprocess_lines | - 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 /> @@ -312,13 +317,13 @@ main by Lorenzo Bettini http://www.lorenzobettini.it http://www.gnu.org/software/src-highlite --> -<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> +<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="silver"># ...</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 /> @@ -327,14 +332,14 @@ http://www.gnu.org/software/src-highlite --> by Lorenzo Bettini http://www.lorenzobettini.it http://www.gnu.org/software/src-highlite --> -<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> +<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="silver"># ...</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 /> @@ -343,13 +348,13 @@ http://www.gnu.org/software/src-highlite --> by Lorenzo Bettini http://www.lorenzobettini.it http://www.gnu.org/software/src-highlite --> -<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><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'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 +367,9 @@ http://www.gnu.org/software/src-highlite --> by Lorenzo Bettini http://www.lorenzobettini.it http://www.gnu.org/software/src-highlite --> -<pre><b><u><font color="#000000">set</font></u></b> -e -grep -q foo <<< 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"><<<</font><font color="#ff0000"> bar</font> +<font color="#ff0000">echo Jo</font> </pre> <br /> <span>Here 'Jo' will never be printed out as the grep didn't find any match. It'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 +378,26 @@ echo Jo by Lorenzo Bettini http://www.lorenzobettini.it http://www.gnu.org/software/src-highlite --> -<pre><i><font color="silver">#!/usr/bin/env bash</font></i> +<pre><i><font color="#ababab">#!/usr/bin/env bash</font></i> -<b><u><font color="#000000">set</font></u></b> -e +<b><font color="#ffffff">set</font></b><font color="#ff0000"> -e</font> -some_function () { - <i><font color="silver"># .. some critical code</font></i> - <i><font color="silver"># ...</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><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="#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="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> -} +<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 /> @@ -407,10 +412,10 @@ some_function () { by Lorenzo Bettini http://www.lorenzobettini.it http://www.gnu.org/software/src-highlite --> -<pre><b><u><font color="#000000">if</font></u></b> [[ <font color="#808080">"${my_var}"</font> > <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><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">></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 /> @@ -419,9 +424,9 @@ http://www.gnu.org/software/src-highlite --> by Lorenzo Bettini http://www.lorenzobettini.it http://www.gnu.org/software/src-highlite --> -<pre><b><u><font color="#000000">if</font></u></b> (( my_var > <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><b><font color="#ffffff">if</font></b><font color="#ff0000"> </font><font color="#F3E651">((</font><font color="#ff0000"> my_var </font><font color="#F3E651">></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 /> @@ -430,9 +435,9 @@ http://www.gnu.org/software/src-highlite --> by Lorenzo Bettini http://www.lorenzobettini.it http://www.gnu.org/software/src-highlite --> -<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><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 /> @@ -445,10 +450,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 - ./* | ( cd <font color="#808080">"${dir}"</font> && 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> >&<font color="#000000">2</font> -<b><u><font color="#000000">fi</font></u></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">&&</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">>&</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'll need to assign PIPESTATUS to another variable immediately after running the command (don't forget that [ is a command and will wipe out PIPESTATUS).</span><br /> @@ -457,14 +462,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 - ./* | ( cd <font color="#808080">"${DIR}"</font> && 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><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">&&</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='use-common-sense-and-be-consistent'>Use common sense and BE CONSISTENT.</h2><br /> @@ -495,11 +500,12 @@ return_codes=( <font color="#808080">"${PIPESTATUS[@]}"</font> ) <br /> <a class='textlink' href='../'>Back to the main site</a><br /> <p class="footer"> - Generated with <a href="https://codeberg.org/snonux/gemtexter">Gemtexter 3.0.1-develop</a> | - served by <a href="https://www.OpenBSD.org">OpenBSD</a>/<a href="https://man.openbsd.org/relayd.8">relayd(8)</a>+<a href="https://man.openbsd.org/httpd.8">httpd(8)</a> | - <a href="https://foo.zone/site-mirrors.html">Site Mirrors</a> - <br /> - Webring: <a href="https://shring.sh/foo.zone/previous">previous</a> | <a href="https://shring.sh">shring</a> | <a href="https://shring.sh/foo.zone/next">next</a> + Generated with <a href="https://codeberg.org/snonux/gemtexter">Gemtexter 3.0.1-develop</a> | + served by <a href="https://www.OpenBSD.org">OpenBSD</a>/<a href="https://man.openbsd.org/relayd.8">relayd(8)</a>+<a href="https://man.openbsd.org/httpd.8">httpd(8)</a> | + <a href="https://foo.zone/site-mirrors.html">Site Mirrors</a> + <br /> + Webring: <a href="https://shring.sh/foo.zone/previous">previous</a> | <a href="https://shring.sh">shring</a> | <a href="https://shring.sh/foo.zone/next">next</a> </p> +<script type="text/javascript" src="../retrofuturistic.js"></script> </body> </html> |
