<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>set variable in bash on Digi Hunch</title><link>https://static.digihunch.com/tag/set-variable-in-bash/</link><description>Recent content in set variable in bash on Digi Hunch</description><generator>Hugo -- gohugo.io</generator><language>en-US</language><lastBuildDate>Sat, 20 Jul 2024 22:29:37 -0400</lastBuildDate><atom:link href="https://static.digihunch.com/tag/set-variable-in-bash/index.xml" rel="self" type="application/rss+xml"/><item><title>Linux Admin Basics 1 of 3 – Bash</title><link>https://static.digihunch.com/2018/02/linux-tips-and-tricks-in-shell/</link><pubDate>Fri, 02 Feb 2018 21:35:00 -0400</pubDate><guid>https://static.digihunch.com/2018/02/linux-tips-and-tricks-in-shell/</guid><description>&lt;p class="wp-block-paragraph"&gt;This article summarized my time-saving Linux tips, mostly with CentOS environment.&lt;/p&gt;&#10;&lt;h3 class="wp-block-heading" id="h-bash-shortcuts"&gt;Bash Shortcuts&lt;/h3&gt;&#10;&lt;figure class="wp-block-image size-large is-resized"&gt;&lt;img loading="lazy" decoding="async" src="https://static.digihunch.com/wp-content/uploads/2020/03/bash.jpg" alt="" class="wp-image-809" width="547" height="215"/&gt;&lt;figcaption class="wp-element-caption"&gt;Bash shortcut illustration&lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;p class="wp-block-paragraph"&gt;These shortcuts save a lot of arrow keystrokes. Some of them may require some tweaking to work on MacOS. &lt;/p&gt;&#10;&lt;figure class="wp-block-table is-style-stripes"&gt;&lt;table class="has-background" style="background-color:#e7f5fe"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;ctrl &amp;#8211; w&lt;/td&gt;&lt;td&gt;delete word&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ctrl &amp;#8211; a&lt;/td&gt;&lt;td&gt;cursor to end of line&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ctrl &amp;#8211; e&lt;/td&gt;&lt;td&gt;cursor to beginning of line&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ctrl &amp;#8211; k&lt;/td&gt;&lt;td&gt;delete to end of line&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ctrl &amp;#8211; u&lt;/td&gt;&lt;td&gt;delete to beginning of line&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ctrl &amp;#8211; l&lt;/td&gt;&lt;td&gt;clear screen&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;cd &amp;#8211; &lt;/td&gt;&lt;td&gt;change to previous directory&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;alt &amp;#8211; b&lt;/td&gt;&lt;td&gt;move cursor back by a word&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;alt &amp;#8211; f&lt;/td&gt;&lt;td&gt;move cursor forward by a word&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;alt &amp;#8211; .&lt;/td&gt;&lt;td&gt;type last parameter of previous command&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/figure&gt;&#10;&lt;h3 class="wp-block-heading" id="h-job-control"&gt;Job Control&lt;/h3&gt;&#10;&lt;p class="wp-block-paragraph"&gt;We need to first understand the following job states:&lt;/p&gt;&#10;&lt;figure class="wp-block-table is-style-stripes color:black"&gt;&lt;table class="has-background" style="background-color:#e7f5fe"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Actively running&lt;/td&gt;&lt;td&gt;Displayed in Active Session&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;foreground job&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;suspended job&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;background job&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/figure&gt;&#10;&lt;p class="wp-block-paragraph"&gt;These states can be managed by the following shortcut keys:&lt;/p&gt;&#10;&lt;figure class="wp-block-table is-style-stripes"&gt;&lt;table class="has-background" style="background-color:#e7f5fe"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;ctrl &amp;#8211; z&lt;/td&gt;&lt;td&gt;send active job to suspended&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ctrl &amp;#8211; c&lt;/td&gt;&lt;td&gt;send SIGINT to active job to kill it&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;jobs&lt;/td&gt;&lt;td&gt;list jobs with id&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;bg&lt;/td&gt;&lt;td&gt;bring a job to background. the current shell still &amp;#8220;owns&amp;#8221; the job&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;fg&lt;/td&gt;&lt;td&gt;bring a job to foreground (by id)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;disown&lt;/td&gt;&lt;td&gt;remove job from current shell&amp;#8217;s job table. the job is still running and can be found by ps command&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;kill&lt;/td&gt;&lt;td&gt;kill a job by id. the job is no longer running and won&amp;#8217;t be found by ps command&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/figure&gt;&#10;&lt;ul class="wp-block-list"&gt;&#10;&lt;li&gt;Note 1: running a command &lt;strong&gt;with ampersand(&amp;amp;) at the end starts the process and pushes it to the background&lt;/strong&gt;, so you can continue typing;&lt;/li&gt;&#10;&lt;li&gt;Note 2: an example is to start vim with a file, ctrl-z to push to background, jobs to view, fg + job id to bring it back&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 class="wp-block-heading" id="h-share-screen"&gt;Share Screen&lt;/h3&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Different persons may share screen on Linux shell and interact with each other. To do so, everyone need to log on the same server as the same linux user. Then the first person runs:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;screen -S screen_name&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;Then the second (and third, etc) person runs:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;screen -x screen_name&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;Now everyone can collaborate by seeing what each other is doing and type at the same time. &lt;/p&gt;&#10;&lt;h3 class="wp-block-heading" id="h-i-o-redirection"&gt;I/O redirection&lt;/h3&gt;&#10;&lt;figure class="wp-block-table is-style-stripes"&gt;&lt;table class="has-background" style="background-color:#e7f5fe"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;file descriptor&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;input or output expression&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;stdin&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;to read file: 0&amp;lt; or &amp;lt; for short&lt;br&gt;to read a single line: &amp;lt;&amp;lt;&amp;lt;&lt;br&gt;to read multiple lines: &amp;lt;&amp;lt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;stdout&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;to overwrite: 1&amp;gt; or &amp;gt; for short&lt;br&gt;to append: 1&amp;gt;&amp;gt; or &amp;gt;&amp;gt; for short&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;stderr&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;to overwrite: 2&amp;gt;&lt;br&gt;to append: 2&amp;gt;&amp;gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/figure&gt;&#10;&lt;p class="wp-block-paragraph"&gt;For example, here is how you display all lines between &amp;#8220;ANYWORD&amp;#8221; (aka &amp;#8220;here document&amp;#8221;):&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat &amp;lt;&amp;lt;ANYWORD&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;paragraph&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;after&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;paragraph&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ANDWORD&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;In addition, to redirect between commands, pipe (|) is used. You may also redirect stdout into stderr or the other way round. Below are several examples:&lt;/p&gt;&#10;&lt;figure class="wp-block-table is-style-stripes"&gt;&lt;table class="has-background" style="background-color:#e7f5fe"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;command1 | command2&lt;/td&gt;&lt;td&gt;redirect stdout of command1 to stdin of command2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;command3 &amp;gt; /dev/null&lt;/td&gt;&lt;td&gt;get rid of stdout from command3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;command4 2&amp;gt; file1&lt;/td&gt;&lt;td&gt;redirect stderr of command4 to file1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;command5 | tee file2&lt;/td&gt;&lt;td&gt;redirect stdout of command5 to stdin for tee command, which display stdout and write to file2 at the same time&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;command6 2&amp;gt;&amp;amp;1&lt;/td&gt;&lt;td&gt;redirect command6&amp;#8217;s stderr into stdout. &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;command7 1&amp;gt;&amp;amp;2&lt;/td&gt;&lt;td&gt;redirect command7&amp;#8217;s stdout into stderr&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/figure&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Note: in the last two examples, the ampersand just indicates the following number is file descriptor instead of file name. &lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;For example, in the first command below, stderr is redirected to stdout, and stdout goes to file. The second and third commands are just two forms of shortcut for the first:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;command &amp;gt; file 2&amp;gt;&amp;amp;1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;command &amp;gt;&amp;amp; file&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;command &amp;amp;&amp;gt; file&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;Here is an advanced example to compare two files from two different servers:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;diff &amp;lt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;ssh user@host1 &lt;span style="color:#e6db74"&gt;&amp;#39;cat /tmp/file1.txt&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;ssh user@host2 &lt;span style="color:#e6db74"&gt;&amp;#39;cat /tmp/file2.txt&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;With the knowledge of I/O redirection, let&amp;#8217;s compare the efficiency of the following two commands in dealing with a huge file:&lt;/p&gt;&#10;&lt;ul class="wp-block-list"&gt;&#10;&lt;li&gt;cat huge.file | mycmd&lt;/li&gt;&#10;&lt;li&gt;mycmd &amp;lt; huge.file&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p class="wp-block-paragraph"&gt;In the first command, cat first causes an I/O read of huge.file, then stdout gets written into pipe buffer. Lastly, the mycmd reads it from its stdin. This is an example of inefficiency. &lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;In the second command, huge.file is provided as stdin to my cmd. Only one read is involved as compared with two read and one write in the previous command. The second command is expected to be three times as fast as the first.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Here is a diagram to illustrate command and I/O redirection:&lt;/p&gt;&#10;&lt;figure class="wp-block-image size-large"&gt;&lt;img loading="lazy" decoding="async" width="723" height="240" src="https://static.digihunch.com/wp-content/uploads/2020/09/image.png" alt="" class="wp-image-1603"/&gt;&lt;/figure&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Check out the page for more scenarios. &lt;/p&gt;&#10;&lt;h3 class="wp-block-heading" id="h-operators"&gt;Operators&lt;/h3&gt;&#10;&lt;p class="wp-block-paragraph"&gt;First, let&amp;#8217;s introduce some special shell variable and operators:&lt;/p&gt;&#10;&lt;figure class="wp-block-table is-style-stripes"&gt;&lt;table class="has-background" style="background-color:#e7f5fe"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;IFS&lt;/td&gt;&lt;td&gt;A special variable indicating internal field separator&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;;&lt;/td&gt;&lt;td&gt;The ; token just separates commands to run. Use it when you&amp;#8217;d like to combine multiple lines of commands into a single line&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;amp;&amp;amp;&lt;/td&gt;&lt;td&gt;Logical AND operator. When you run command1 &amp;amp;&amp;amp; command2, command2 ONLY runs if command1 returns true (success, or exit status = 0).&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;||&lt;/td&gt;&lt;td&gt;Logical OR operator. When you run command1 &amp;amp;&amp;amp; command2, command2 ONLY runs if command1 does not return false (fail, or exit status != 0)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;{}&lt;/td&gt;&lt;td&gt;command combination operator. e.g. {command1;command2}&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;()&lt;/td&gt;&lt;td&gt;precedence operator&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/figure&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Note the use of &amp;amp;&amp;amp; and || are fairly common. &amp;amp;&amp;amp; is used when you want to use the first command to provide a good status for the second. || is used when you want to report error about the first command. For example:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;test -d &amp;#34;/tmp/newdir&amp;#34; || mkdir -p &amp;#34;/tmp/newdir&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;test -f &amp;#34;/var/run/app/app.pid&amp;#34; || echo &amp;gt;&amp;amp;2 &amp;#34;ERROR: cannot detect pid&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 class="wp-block-heading"&gt;Attributes&lt;/h3&gt;&#10;&lt;p class="wp-block-paragraph"&gt;I&amp;#8217;ve been using &lt;strong&gt;chown &lt;/strong&gt;and &lt;strong&gt;chmod &lt;/strong&gt;to manipulate owners and file permissions against owners, groups and other users. I recently realized another command &lt;strong&gt;chattr &lt;/strong&gt;(change attribute) which controls file attributes, regardless of users or groups. In other words, if you change the attribute of a file to immutable, then even the owner isn&amp;#8217;t able to change it. Its manual has full list of attributes, but common ones are:&lt;/p&gt;&#10;&lt;ul class="wp-block-list"&gt;&#10;&lt;li&gt;a -&amp;gt; Append only&lt;/li&gt;&#10;&lt;li&gt;i -&amp;gt; Immutable&lt;/li&gt;&#10;&lt;li&gt;c -&amp;gt; File automatically compressed in kernel.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p class="wp-block-paragraph"&gt;For example, the append only attribute is commonly used for log file to prevent any other users from modifying the file. Sometimes we want to keep system files from being changed as well:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;chattr -i /etc/resolv.conf&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &amp;#34;nameserver 8.8.8.8&amp;#34; &amp;gt; /etc/resolv.conf &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;chattr +i /etc/resolv.conf&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;Whatever attribute that we set with &lt;strong&gt;chattr&lt;/strong&gt;, we can use &lt;strong&gt;lsattr &lt;/strong&gt;to list them. These two commands are in Linux not BSD.&lt;/p&gt;&#10;&lt;h3 class="wp-block-heading" id="h-loop"&gt;Loop&lt;/h3&gt;&#10;&lt;p class="wp-block-paragraph"&gt;If you can tell how many iterations, then use for loop. For example, you want to execute a command for each file in a directory:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; file in /tmp/*.hl7&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;do&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;Picking File &lt;/span&gt;$file&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; output.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; hl7snd -f &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$file&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; -d destionatiohost:2398 &amp;gt;&amp;gt; output.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sleep &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;done&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;or you may specify range and steps for a for loop: &lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; i in &lt;span style="color:#f92672"&gt;{&lt;/span&gt;1..11..2&lt;span style="color:#f92672"&gt;}&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;13..23..2&lt;span style="color:#f92672"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;do&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;hostmachine&amp;#34;&lt;/span&gt;$i&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; scp local.file &lt;span style="color:#e6db74"&gt;&amp;#34;hostmachine&amp;#34;&lt;/span&gt;$i:/tmp/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;done&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;Note that the way we use step here is only available on Bash 4.x (check version through variable $BASH_VERSION, reference)&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;If it&amp;#8217;s hard to tell how many iterations, then use while loop. Here are some examples&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Example 1. You want to execute the same command multiple times, each with a line in a file as parameter:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; IFS&lt;span style="color:#f92672"&gt;=&lt;/span&gt; read -r var&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;do&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;date +%Y%m%d:%H%M%S&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt; displaying line &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$var&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; resend.log&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sleep &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;done&lt;/span&gt; &amp;lt; list.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;Example 2. One step further, if the input file is a CSV format like this:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;acc1,pid1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;acc2,pid2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;acc3,pid3&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;And you want to repeat a command multiple times, each execution with a column 1 as parameter 1, column 2 as parameter 2, etc. Then you can run something like this:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;IFS&lt;span style="color:#f92672"&gt;=&lt;/span&gt;,&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;echo -en &lt;span style="color:#e6db74"&gt;&amp;#34;\r\n\b&amp;#34;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; read -r f1 f2; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;do&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo processing $f1, $f2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -i -X PUT -H &lt;span style="color:#e6db74"&gt;&amp;#34;Content-Type:application/json&amp;#34;&lt;/span&gt; -d &lt;span style="color:#e6db74"&gt;&amp;#39;{&amp;#34;userId&amp;#34;:&amp;#34;dhunch&amp;#34;}&amp;#39;&lt;/span&gt; --url http://localhost:9876/monitoring/document/$f1/$f2/publish;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;done&lt;/span&gt; &amp;lt; input.txt &amp;gt;&amp;gt;out.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;In this example IFS assignment is done before while loop. So it will take effect outside of while loop. This is why \r, \n and \b are specified in addition to comma. If this is not something you like, you may put IFS assignment after while and only specify comma as field separator.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Example 3. If you just want to repeat the same command every 5 seconds, apart from watch command, you can leverage while loop doing something like this:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; true; &lt;span style="color:#66d9ef"&gt;do&lt;/span&gt; df -Ph | grep &lt;span style="color:#e6db74"&gt;&amp;#34;sda1&amp;#34;&lt;/span&gt;; sleep 10; &lt;span style="color:#66d9ef"&gt;done&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;In fact in all these examples while loop can be expressed in a single line, with semicolon to indicate where you would have typed enter.&lt;/p&gt;&#10;&lt;h3 class="wp-block-heading" id="h-find-with-xargs-and-exec"&gt;find, with xargs and -exec {}&lt;/h3&gt;&#10;&lt;p class="wp-block-paragraph"&gt;The find command offers flexibility searching files with certain conditions.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Example 1. Find files from within last 5 * 24 hours in current directory:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;find -maxdepth &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; -type f -mtime -5&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;Example 2. Find tar files older than 6 * 24 hours:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;find . -type f -name &lt;span style="color:#e6db74"&gt;&amp;#34;*.tar&amp;#34;&lt;/span&gt; -mtime +6&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;Notes:&lt;/p&gt;&#10;&lt;ul class="wp-block-list"&gt;&#10;&lt;li&gt;the switch -iname is similiar to -name but case insensitive&lt;/li&gt;&#10;&lt;li&gt;the switch -mtime goes by modified datetime; -atime goes by access time&lt;/li&gt;&#10;&lt;li&gt;the switch -mmin measures in minutes&lt;/li&gt;&#10;&lt;li&gt;the swtich -daystart makes it measure time from the beginning of current day (instead of 24 hours from current time of current day)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p class="wp-block-paragraph"&gt;&lt;a href="https://www.cyberciti.biz/faq/howto-finding-files-by-date/"&gt;Here&lt;/a&gt; are more information about find command, and &lt;a href="https://www.cyberciti.biz/faq/linux-unix-osxfind-files-by-date/"&gt;more examples&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;To execute command per result from find, we have the options of xargs and -exec {}. Both build command based on parameter input, instead of I/O redirection. xargs is considered more efficient and it also works with commands other than find. -exec {} only works with find command. &lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Here&amp;#8217;s a basic example of -exec {}&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;find . -iname &lt;span style="color:#e6db74"&gt;&amp;#39;*.dcm&amp;#39;&lt;/span&gt; -exec dcm2txt &lt;span style="color:#f92672"&gt;{}&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;On the other hand, xargs works with any command followed by a pipe. It takes input from previous command, split it by space or carriage return into a list, then build command with each item on the list. To help understand parameter passing with xargs, we examine two examples. The first example is a directory with three files in it: x.a, y.a, z.a&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ ls&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;x.a x.b x.c&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;If we want to prefix each file with pre, we can do the following:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ls | xargs -I aa echo &lt;span style="color:#e6db74"&gt;&amp;#34;mv aa prefix_aa&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;In the second example, suppose find command produces the following result:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;firstdir&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;seconddir&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;Compare the following two commands:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;find . -type d | xargs ls -l&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;find . -type d | xargs -n &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; ls -l&#9;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p class="wp-block-paragraph"&gt;In the first command, xargs invokes &amp;#8220;ls -l firstdir seconddir&amp;#8221; whereas in the second command, xargs invokes &amp;#8220;ls -l firstdir&amp;#8221; and then &amp;#8220;ls -l seconddir&amp;#8221;. The first command requires that the utility takes multiple parameters (in this case, ls does. Other commands such as wc, grep also do). The second command is particular helpful when the &lt;span style="text-decoration: underline;"&gt;utility only takes one parameter&lt;/span&gt;. This is because the switch -n sets the maximum number of arguments taken from standard input for each invocation of utility.&lt;/p&gt;&#10;&lt;p class="wp-block-paragraph"&gt;Last but not least, operators are quite useful in Bash scripting. &lt;a href="https://kapeli.com/cheat_sheets/Bash_Test_Operators.docset/Contents/Resources/Documents/index"&gt;Here &lt;/a&gt;is a good reference.&lt;/p&gt;&#10;&lt;nav class="wp-post-navigation" aria-label="Post navigation"&gt;&#10;&lt;p&gt;&lt;a rel="next" href="https://static.digihunch.com/2018/02/tcpdump-and-wireshark/"&gt;&lt;span class="wp-post-navigation-label"&gt;Next Post&lt;/span&gt;&lt;strong class="wp-post-navigation-title"&gt;TCPdump and Wireshark configuration&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;/nav&gt;&#10;</description></item></channel></rss>