<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Ahmed Musallam</title>
    <description>The latest articles on Forem by Ahmed Musallam (@ahmedmusallam).</description>
    <link>https://forem.com/ahmedmusallam</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F65343%2F3941bd96-7bda-499b-8b65-c0035dc47ee8.jpeg</url>
      <title>Forem: Ahmed Musallam</title>
      <link>https://forem.com/ahmedmusallam</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/ahmedmusallam"/>
    <language>en</language>
    <item>
      <title>What software/services cause you the most agony?</title>
      <dc:creator>Ahmed Musallam</dc:creator>
      <pubDate>Thu, 12 Sep 2019 15:55:54 +0000</pubDate>
      <link>https://forem.com/ahmedmusallam/what-software-services-causes-you-the-most-agony-3a8k</link>
      <guid>https://forem.com/ahmedmusallam/what-software-services-causes-you-the-most-agony-3a8k</guid>
      <description>&lt;p&gt;I'd like to take this opportunity to start a support group for users of traumatizing software.&lt;/p&gt;

&lt;p&gt;I'll start.&lt;/p&gt;

&lt;p&gt;Hello, I'm Ahmed, and I have to use Skype For Business and Webex on a daily basis. Every-time I try to connect to my calls, I have to say a little prayer, cross my fingers, roll a 100-sided die, and just HOPE that it works out! 🤣&lt;/p&gt;

&lt;p&gt;Do you use software like that on a daily basis? What's the most frustrating software you work or have worked with in the past?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;This is really meant to be lighthearted discussion and let software frustrations out through comedy 😊&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>discuss</category>
    </item>
    <item>
      <title>How To Autocomplete SSH Hosts</title>
      <dc:creator>Ahmed Musallam</dc:creator>
      <pubDate>Fri, 06 Sep 2019 01:09:11 +0000</pubDate>
      <link>https://forem.com/ahmedmusallam/how-to-autocomplete-ssh-hosts-1hob</link>
      <guid>https://forem.com/ahmedmusallam/how-to-autocomplete-ssh-hosts-1hob</guid>
      <description>&lt;p&gt;So you know about SSH config file, there are several awesome articles on the subject:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://linuxize.com/post/using-the-ssh-config-file/#ssh-config-file-structure-and-patterns" rel="noopener noreferrer"&gt;This awesome article&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and this one that covers some tips and tricks&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/cpu" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F127903%2F572c8b29-f6ae-4040-86f6-1aad943b7d61.jpeg" alt="cpu"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/cpu/ssh-config-tips-and-tricks-54hk" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;SSH Config Tips and Tricks&lt;/h2&gt;
      &lt;h3&gt;Daniel McCarney ・ Feb 1 '19&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#linux&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#cli&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#ssh&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#security&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;Now, with all of that, you still have to remember the full host entry to connect and it will not be autocompleted for you.&lt;/p&gt;

&lt;p&gt;let's say I have the following in my config file:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


Host unicorn-one
  HostName 1.2.3.4
  User amusallam
  IdentityFile ~/.ssh/id_rsa

Host unicorn-two
  HostName 2.2.3.4
  User amusallam
  IdentityFile ~/.ssh/id_rsa

Host unicorn-three
  HostName 3.2.3.4
  User amusallam
  IdentityFile ~/.ssh/id_rsa


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;and now I type &lt;code&gt;ssh unicorn&lt;/code&gt; into terminal and hit ⇥ Tab, it will not auto complete...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/ZEgBHVeRlmTqjCPlqx/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/ZEgBHVeRlmTqjCPlqx/giphy.gif" alt="sad gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But fear not! for I have what your heart desires!&lt;/p&gt;
&lt;h2&gt;
  
  
  Autocomplete Script
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;I've only tried this on MacOs.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;courtesy of this stackexchange answer:&lt;/p&gt;


&lt;div class="ltag__stackexchange--container"&gt;
  &lt;div class="ltag__stackexchange--title-container"&gt;
    
      &lt;div class="ltag__stackexchange--title"&gt;
        &lt;div class="ltag__stackexchange--header"&gt;
          &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fstackexchange-logo-37d4118c1280b00533496a8c870284b2c0d08fac862f7cf964b9469b9db96984.svg" alt=""&gt;
          &lt;a href="https://unix.stackexchange.com/questions/136351/autocomplete-server-names-for-ssh-and-scp/181603#181603" rel="noopener noreferrer"&gt;
            &lt;span class="title-flare"&gt;answer&lt;/span&gt; re: Autocomplete server names for SSH and SCP
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="ltag__stackexchange--post-metadata"&gt;
          &lt;span&gt;Jan 28 '15&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
      &lt;a class="ltag__stackexchange--score-container" href="https://unix.stackexchange.com/questions/136351/autocomplete-server-names-for-ssh-and-scp/181603#181603" rel="noopener noreferrer"&gt;
        &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fstackexchange-arrow-up-eff2e2849e67d156181d258e38802c0b57fa011f74164a7f97675ca3b6ab756b.svg" alt=""&gt;
        &lt;div class="ltag__stackexchange--score-number"&gt;
          105
        &lt;/div&gt;
        &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fstackexchange-arrow-down-4349fac0dd932d284fab7e4dd9846f19a3710558efde0d2dfd05897f3eeb9aba.svg" alt=""&gt;
      &lt;/a&gt;
    
  &lt;/div&gt;
  &lt;div class="ltag__stackexchange--body"&gt;
    
&lt;p&gt;&lt;strong&gt;Found it!!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It seems that in Ubuntu &lt;a href="https://bugs.launchpad.net/ubuntu/+source/bash/+bug/42382" rel="noreferrer noopener"&gt;the entries in &lt;code&gt;~/.ssh/known_hosts&lt;/code&gt; are hashed&lt;/a&gt;, so SSH completion cannot read them. This is a feature, not a bug. Even by adding &lt;code&gt;HashKnownHosts no&lt;/code&gt; to &lt;code&gt;~/.ssh/config&lt;/code&gt; and &lt;code&gt;/etc/ssh/ssh_config&lt;/code&gt; I was unable to prevent the host hashing.&lt;/p&gt;
&lt;p&gt;However, the hosts that I am…&lt;/p&gt;
    
  &lt;/div&gt;
  &lt;div class="ltag__stackexchange--btn--container"&gt;
    &lt;a href="https://unix.stackexchange.com/questions/136351/autocomplete-server-names-for-ssh-and-scp/181603#181603" class="ltag__stackexchange--btn" rel="noopener noreferrer"&gt;Open Full Answer&lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;add the following file: &lt;code&gt;/etc/bash_completion.d/ssh&lt;/code&gt; whose contents:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

_ssh&lt;span class="o"&gt;()&lt;/span&gt; 
&lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;local &lt;/span&gt;cur prev opts
    &lt;span class="nv"&gt;COMPREPLY&lt;/span&gt;&lt;span class="o"&gt;=()&lt;/span&gt;
    &lt;span class="nv"&gt;cur&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;COMP_WORDS&lt;/span&gt;&lt;span class="p"&gt;[COMP_CWORD]&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="nv"&gt;prev&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;COMP_WORDS&lt;/span&gt;&lt;span class="p"&gt;[COMP_CWORD-1]&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="nv"&gt;opts&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s1"&gt;'^Host'&lt;/span&gt; ~/.ssh/config ~/.ssh/config.d/&lt;span class="k"&gt;*&lt;/span&gt; 2&amp;gt;/dev/null | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="s1"&gt;'[?*]'&lt;/span&gt; | &lt;span class="nb"&gt;cut&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;' '&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; 2-&lt;span class="si"&gt;)&lt;/span&gt;

    &lt;span class="nv"&gt;COMPREPLY&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;compgen&lt;/span&gt; &lt;span class="nt"&gt;-W&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$opts&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;cur&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt; &lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return &lt;/span&gt;0
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="nb"&gt;complete&lt;/span&gt; &lt;span class="nt"&gt;-F&lt;/span&gt; _ssh ssh


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Then load that file: in your &lt;code&gt;~/.bash_profile&lt;/code&gt;, add:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="c"&gt;## load ssh autocompletion&lt;/span&gt;
&lt;span class="nb"&gt;.&lt;/span&gt; /etc/bash_completion.d/ssh



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;and reload by running &lt;code&gt;source ~/.bash_profile&lt;/code&gt; or just terminate your terminal and reopen it.&lt;/p&gt;

&lt;p&gt;and voila!&lt;/p&gt;

&lt;p&gt;(The flashes you see below are me hitting ⇥ Tab)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F84a1xd9pv1id7rweutsv.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F84a1xd9pv1id7rweutsv.gif" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;easy peasy!&lt;/p&gt;

&lt;h2&gt;
  
  
  Extra helpful alias
&lt;/h2&gt;

&lt;p&gt;if you want to see a list of all your hosts, you can add this alias to your &lt;code&gt;.bash_profile&lt;/code&gt;:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="c"&gt;# list all "Host" and "HostName" lines, then remove the strings: "Host " and "HostName "&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;sshhosts&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"grep -w -i -E 'Host|HostName' ~/.ssh/config | sed 's/Host //' | sed 's/HostName //'"&lt;/span&gt;



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;reload by running &lt;code&gt;source ~/.bash_profile&lt;/code&gt; or just terminate your terminal and reopen it.&lt;/p&gt;

&lt;p&gt;then you can run it:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

sshhosts


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;from unicorn example above, this prints:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

unicorn-one
  1.2.3.4
unicorn-two
  2.2.3.4
unicorn-three
  3.2.3.4


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>ssh</category>
    </item>
    <item>
      <title>🔖 Bookmarklets Manager Chrome Extension!</title>
      <dc:creator>Ahmed Musallam</dc:creator>
      <pubDate>Fri, 14 Jun 2019 17:06:43 +0000</pubDate>
      <link>https://forem.com/ahmedmusallam/bookmarklets-manager-chrome-extension-396f</link>
      <guid>https://forem.com/ahmedmusallam/bookmarklets-manager-chrome-extension-396f</guid>
      <description>&lt;p&gt;All info you need to install is here:&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qF2jUiUG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/github-logo-6a5bca60a4ebf959a6df7f08217acd07ac2bc285164fae041eacb8a148b1bab9.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/ahmed-musallam"&gt;
        ahmed-musallam
      &lt;/a&gt; / &lt;a href="https://github.com/ahmed-musallam/chrome-bookmarklet-manager"&gt;
        chrome-bookmarklet-manager
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A chrome extension to manage bookmarklets!
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="instapaper_body md"&gt;
&lt;h1&gt;
🔖 Chrome Bookmarklet Manager&lt;/h1&gt;
&lt;p&gt;A chrome extension to edit &lt;a href="https://en.wikipedia.org/wiki/Bookmarklet" rel="nofollow"&gt;bookmarklets&lt;/a&gt; with the &lt;a href="https://microsoft.github.io/monaco-editor/" rel="nofollow"&gt;monaco editor&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://raw.githubusercontent.com/ahmed-musallam/chrome-bookmarklet-manager/master/docs/bookmarklets-manager.gif"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DHdT2glY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://raw.githubusercontent.com/ahmed-musallam/chrome-bookmarklet-manager/master/docs/bookmarklets-manager.gif" alt="bookmarklet manager demo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A bookmarklet is a bookmark stored in a web browser that contains JavaScript commands that add new features to the browser.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
Install&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;pending review on chrome store&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Go to &lt;code&gt;chrome://extensions/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Enable &lt;code&gt;Developer mode&lt;/code&gt; slider&lt;/li&gt;
&lt;li&gt;Download the latest &lt;code&gt;.ext&lt;/code&gt; from (releases](&lt;a href="https://github.com/ahmed-musallam/chrome-bookmarklet-manager/releases"&gt;https://github.com/ahmed-musallam/chrome-bookmarklet-manager/releases&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Drag &lt;code&gt;.ext&lt;/code&gt; file onto chrome to install&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
Development&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Clone this repo&lt;/li&gt;
&lt;li&gt;Go to &lt;code&gt;chrome://extensions/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Enable &lt;code&gt;Developer mode&lt;/code&gt; slider&lt;/li&gt;
&lt;li&gt;Click &lt;code&gt;Load unpacked&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Aelect the &lt;code&gt;ext&lt;/code&gt; folder from the cloned repo&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;npm run dev&lt;/code&gt;: will watch source changes and build the Js bundle and put it in the &lt;code&gt;ext&lt;/code&gt; folder.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/ahmed-musallam/chrome-bookmarklet-manager"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;This project has been in the making for quite some time. I wanted a bookmarklet manager extension that did not run any code on pages without the user actually trigging said code. This extension runs no &lt;a href="https://developer.chrome.com/extensions/content_scripts"&gt;Content Scripts&lt;/a&gt; which means that the extension itself does not load any code onto the pages you visit, nor does it care! All this extension does, is give you a way to edit bookmarks that start with &lt;code&gt;javascript:&lt;/code&gt; in a nice editor. Oh did I forget to mention it uses the &lt;a href="https://microsoft.github.io/monaco-editor/"&gt;monaco editor&lt;/a&gt;? the editor behind VSCode!&lt;/p&gt;

&lt;p&gt;Give it a shot, and let me know what you think! I would appreciate any input/pull requests/stars you can give!&lt;/p&gt;

&lt;p&gt;PS. This extension is built with Vue, I am no Vue expert. Still learning :)&lt;/p&gt;

</description>
      <category>dev</category>
      <category>opensource</category>
      <category>showcase</category>
    </item>
    <item>
      <title>Tell me about jQuery Patterns!</title>
      <dc:creator>Ahmed Musallam</dc:creator>
      <pubDate>Wed, 05 Jun 2019 01:35:04 +0000</pubDate>
      <link>https://forem.com/ahmedmusallam/tell-me-about-jquery-patterns-3621</link>
      <guid>https://forem.com/ahmedmusallam/tell-me-about-jquery-patterns-3621</guid>
      <description>&lt;p&gt;Yesterday, &lt;a href="https://dev.to/ben"&gt;Ben&lt;/a&gt; wrote this question:&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/ben" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bgwIhvJ3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--1M1qt9Sp--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/1/f451a206-11c8-4e3d-8936-143d0a7e65bb.png" alt="ben image"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/ben/anybody-still-working-with-jquery-l0" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Anybody still working with jQuery?&lt;/h2&gt;
      &lt;h3&gt;Ben Halpern ・ Jun  3 '19 ・ 1 min read&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#discuss&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#javascript&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#jquery&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;And it got me curious about jQuery patterns/frameworks that people use to make maintaining large jQuery projects easier.&lt;/p&gt;

&lt;p&gt;I've been using &lt;a href="https://jqueryui.com/widget/"&gt;jQuery Widget&lt;/a&gt; getting a custom download of jQuery UI with &lt;a href="https://jqueryui.com/download/#!version=1.12.1&amp;amp;components=100000000000000000000000000000000000000000000000"&gt;only the widget API&lt;/a&gt; Or I make my own stateful components via JS prototypes and try to make an API to scope querying the DOM to the specific HTML subtree. I even wrote a &lt;a href="https://github.com/ahmed-musallam/syrupjs"&gt;small tool to distant interactions via pub/sub model&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Anyway, I really want to hear what other people do to maintain their large jQuery applications?&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>jquery</category>
    </item>
    <item>
      <title>I Challenge YOU to Write a Better Parser!</title>
      <dc:creator>Ahmed Musallam</dc:creator>
      <pubDate>Tue, 30 Apr 2019 18:03:25 +0000</pubDate>
      <link>https://forem.com/ahmedmusallam/i-challenge-you-to-write-a-better-parser-446e</link>
      <guid>https://forem.com/ahmedmusallam/i-challenge-you-to-write-a-better-parser-446e</guid>
      <description>&lt;p&gt;So here is the deal, I wrote this really Stupid &lt;a href="https://sling.apache.org/documentation/the-sling-engine/url-decomposition.html" rel="noopener noreferrer"&gt;Sling URL&lt;/a&gt; Parser:&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/ahmed-musallam" rel="noopener noreferrer"&gt;
        ahmed-musallam
      &lt;/a&gt; / &lt;a href="https://github.com/ahmed-musallam/stupid-sling-url-parser" rel="noopener noreferrer"&gt;
        stupid-sling-url-parser
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A really stupid JS to parse Apache Sling URL
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;A Really stupid Apache Sling URL Parser&lt;/h1&gt;

&lt;/div&gt;
&lt;p&gt;This is a stupid implementation to parse &lt;a href="https://sling.apache.org/documentation/the-sling-engine/url-decomposition.html" rel="nofollow noopener noreferrer"&gt;Apache Sling Url&lt;/a&gt; in JS. &lt;strong&gt;You should really use &lt;a href="https://github.com/nateyolles/sluri" rel="noopener noreferrer"&gt;Sluri&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;I built this for fun. It only supports Modern browsers (Sorry not sorry IE) and NodeJs 10+. Also, it is EXTREMELY small! ~0.8KB minified. Sluri is 6.5 KB minified but has a lot more functionality.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Usage&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Get the minified version in &lt;code&gt;/dist&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight highlight-source-js notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-k"&gt;const&lt;/span&gt; &lt;span class="pl-s1"&gt;slingUrl&lt;/span&gt; &lt;span class="pl-c1"&gt;=&lt;/span&gt; &lt;span class="pl-k"&gt;new&lt;/span&gt; &lt;span class="pl-v"&gt;SlingUrl&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-s"&gt;'/a/b.s1.html/c/d'&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;&lt;span class="pl-kos"&gt;;&lt;/span&gt;


&lt;span class="pl-smi"&gt;console&lt;/span&gt;&lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-en"&gt;log&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-s1"&gt;slingUrl&lt;/span&gt;&lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-c1"&gt;resourcePath&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt; &lt;span class="pl-c"&gt;// returns: "/a/b"&lt;/span&gt;
&lt;span class="pl-smi"&gt;console&lt;/span&gt;&lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-en"&gt;log&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-s1"&gt;slingUrl&lt;/span&gt;&lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-c1"&gt;selectors&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;    &lt;span class="pl-c"&gt;// returns ["s1"]&lt;/span&gt;
&lt;span class="pl-smi"&gt;console&lt;/span&gt;&lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-en"&gt;log&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-s1"&gt;slingUrl&lt;/span&gt;&lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-c1"&gt;extension&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;    &lt;span class="pl-c"&gt;// returns "html"&lt;/span&gt;
&lt;span class="pl-smi"&gt;console&lt;/span&gt;&lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-en"&gt;log&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-s1"&gt;slingUrl&lt;/span&gt;&lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-c1"&gt;suffix&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;       &lt;span class="pl-c"&gt;// returns "/c/d"&lt;/span&gt;

&lt;span class="pl-c"&gt;// if any of the properties above does not exist, null is returned.&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Source&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;see &lt;a href="https://github.com/ahmed-musallam/stupid-sling-url-parser/src/SlingUrl.js" rel="noopener noreferrer"&gt;/src/SlingUrl.js&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Running tests&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;npm test
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/ahmed-musallam/stupid-sling-url-parser" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;The whole source is in this file: &lt;a href="https://github.com/ahmed-musallam/stupid-sling-url-parser/blob/master/src/SlingUrl.js" rel="noopener noreferrer"&gt;https://github.com/ahmed-musallam/stupid-sling-url-parser/blob/master/src/SlingUrl.js&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'm setting a pretty low bar here, since I wrote this very quickly for the SOLE purpose of saving bytes.&lt;/p&gt;

&lt;p&gt;Now, I'd like to see you try to write something better! It would be a good exercise if you're up for it. Plus you'd show &lt;a href="https://meta.wikimedia.org/wiki/Cunningham%27s_Law" rel="noopener noreferrer"&gt;some random person on the internet how wrong they are.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;All you need to know to rebuild this is in the &lt;a href="https://sling.apache.org/documentation/the-sling-engine/url-decomposition.html" rel="noopener noreferrer"&gt;URL Decomposition Doc of Apache Sling&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The doc has examples and I have written &lt;a href="https://github.com/ahmed-musallam/stupid-sling-url-parser/blob/master/test/test.js" rel="noopener noreferrer"&gt;tests for my parser&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy coding!&lt;/p&gt;

</description>
      <category>sling</category>
      <category>challenge</category>
      <category>help</category>
    </item>
    <item>
      <title>VirtualBox: How To Access Host Port From Guest</title>
      <dc:creator>Ahmed Musallam</dc:creator>
      <pubDate>Thu, 21 Mar 2019 17:03:14 +0000</pubDate>
      <link>https://forem.com/ahmedmusallam/virtualbox-how-to-access-host-port-from-guest-i6n</link>
      <guid>https://forem.com/ahmedmusallam/virtualbox-how-to-access-host-port-from-guest-i6n</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;originally posted on &lt;a href="https://ahmedmusallam.com/blog/virtualbox-how-to-access-host-port-from-guest/" rel="noopener noreferrer"&gt;my site&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I'm always working on a Mac machine, but sometimes I need to debug an issue that only affects windows machines and more specifically IE. For that, I usually use &lt;a href="https://www.virtualbox.org/" rel="noopener noreferrer"&gt;VirtualBox&lt;/a&gt; with a &lt;a href="https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/" rel="noopener noreferrer"&gt;free VM from Microsoft&lt;/a&gt; for debugging.&lt;/p&gt;

&lt;p&gt;I never remember what to do to access a server running on my Mac from my Windows VM. So I'm writing this, for me. And I guess for you too!&lt;/p&gt;

&lt;h2&gt;
  
  
  Port Forwarding
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Shutdown your VM&lt;/li&gt;
&lt;li&gt;Open &lt;code&gt;settings&lt;/code&gt; for the VM and select &lt;code&gt;network&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;make Sure the &lt;code&gt;Attached to&lt;/code&gt; dropdown is set to &lt;code&gt;NAT&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;expand &lt;code&gt;Advanced&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;code&gt;Port Forwarding&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Add a new rule. In my case, I want to forward port &lt;code&gt;4502&lt;/code&gt; on my guest to port &lt;code&gt;4502&lt;/code&gt; on my host. leave the IP fields empty&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fowb35ckdjatwnvx6rq7o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fowb35ckdjatwnvx6rq7o.png" alt="settings"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fswn3qg1j92r656a6ikly.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fswn3qg1j92r656a6ikly.png" alt="settings"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0t4y4cfdgh8xklx1ud4d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0t4y4cfdgh8xklx1ud4d.png" alt="settings"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding Your Host Local IP
&lt;/h2&gt;

&lt;p&gt;Now you need to find the host (Mac) local IP that is assigned to you by your router, this typically starts with &lt;code&gt;192&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;you can find this in MacOs by following this &lt;a href="https://apple.stackexchange.com/a/212207/255822" rel="noopener noreferrer"&gt;SO answer&lt;/a&gt; point &lt;strong&gt;#3&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;basically run the one of the following commands to get your local IP:&lt;/p&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ipconfig getifaddr en0&lt;/code&gt; if connected via a wireless connection.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ipconfig getifaddr en1&lt;/code&gt; if connected via ethernet.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ipconfig getifaddr en3&lt;/code&gt; if connected via a Thunderbolt-to-ethernet adaptor.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Accessing Server Running on Your Host From Your Guest
&lt;/h2&gt;

&lt;p&gt;now that you have the IP, you can use it to access the forwarded port from your guest VM.&lt;/p&gt;

&lt;p&gt;In my case, the IP of the host turned out to be &lt;code&gt;192.168.10.20&lt;/code&gt; so, in my windows VM I can access the URL: &lt;code&gt;http://192.168.10.20:4502&lt;/code&gt;!&lt;/p&gt;

</description>
      <category>virtualbox</category>
    </item>
    <item>
      <title>Do you leave jokes in your code? If so, please share!</title>
      <dc:creator>Ahmed Musallam</dc:creator>
      <pubDate>Sun, 13 Jan 2019 18:58:04 +0000</pubDate>
      <link>https://forem.com/ahmedmusallam/do-you-leave-jokes-in-your-code-if-so-please-share-2hkb</link>
      <guid>https://forem.com/ahmedmusallam/do-you-leave-jokes-in-your-code-if-so-please-share-2hkb</guid>
      <description>&lt;p&gt;Sometimes, I leave bad jokes in my code, here are some examples from a backup tool I built a while back:&lt;/p&gt;

&lt;p&gt;When a user tries to delete a backup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;console.log(`Still wanna do it? just checkin'...`)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;When trying to remove a backup but something wrong happens:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;spinner.fail(`ummm, yeah.. this is awkward; we could't delete the backups for some reason`)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;When the user tries to remove a backup, but then cancels at the prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;console.log(`Whew, nothing happened. That must feel good, eh?`.green)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;When something goes wrong:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;spinner.fail('womp womp... some error occurred *rolls eyes*')
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Other times, I add a funny* comment to a funky looking piece of code, just because..&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I am curious if other devs do it to, do you do anything like that? funny comments? funny method/variable names? or funny messages you show to users? please share!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;*Depends on whom you ask ;)&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>jokes</category>
    </item>
    <item>
      <title>Do you want to help me build a searchable Black Friday database?</title>
      <dc:creator>Ahmed Musallam</dc:creator>
      <pubDate>Sun, 11 Nov 2018 07:23:50 +0000</pubDate>
      <link>https://forem.com/ahmedmusallam/do-you-want-to-help-me-build-a-searchable-black-friday-database-239k</link>
      <guid>https://forem.com/ahmedmusallam/do-you-want-to-help-me-build-a-searchable-black-friday-database-239k</guid>
      <description>&lt;p&gt;I recently discovered &lt;a href="https://bestblackfriday.com" rel="noopener noreferrer"&gt;bestblackfriday.com&lt;/a&gt; and I thought how cool would it be if all those Black Friday scans were to be converted into a searchable database and open sourced possibly as JSON files for anyone to grab, plug into a database (or use as is) and build a simple UI around it.&lt;/p&gt;

&lt;p&gt;This effort would involve manually looking at the add scans and adding products one by one and by hand.&lt;/p&gt;

&lt;p&gt;Anyone willing to help with this effort? Any suggestions or reservations regarding this idea?&lt;/p&gt;

&lt;p&gt;Obviously this is time sensitive as Black Friday is only 2 weeks away, but I think this might be a great opportunity!&lt;/p&gt;

</description>
      <category>help</category>
    </item>
    <item>
      <title>Do you know of an in-browser javascript compressor?</title>
      <dc:creator>Ahmed Musallam</dc:creator>
      <pubDate>Fri, 14 Sep 2018 08:21:14 +0000</pubDate>
      <link>https://forem.com/ahmedmusallam/do-you-know-of-an-in-browser-javascript-compressor-3a5a</link>
      <guid>https://forem.com/ahmedmusallam/do-you-know-of-an-in-browser-javascript-compressor-3a5a</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;I am hoping this post is appropriate here :)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I'm looking for suggestions for an in-browser javascript compressor. I don't need an obfuscater/uglifier (though, it's welcome). I need a Javascript library than can take a string of javascript code that might be formatted with new lines, spaces, tabs.. etc. and output a single line of javascript.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;tried to look on the web and on github, but most libraries I found depended on nodeJS API.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;sayHi&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hi!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;sayHi&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;would be outputted as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;sayHi&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hi there&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="nx"&gt;sayHi&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I need the JS in one line for a very specific use-case for an open source  chrome extension I am going to start working on. Your help is appreciated!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;After writing this I realize that I can just remove all instances of new line with a regex. But maybe there is something better out there ?&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>discuss</category>
    </item>
    <item>
      <title>I like the new dev.to fixed reaction bar. but let's hide it for fun!</title>
      <dc:creator>Ahmed Musallam</dc:creator>
      <pubDate>Fri, 14 Sep 2018 07:55:28 +0000</pubDate>
      <link>https://forem.com/ahmedmusallam/i-like-the-new-devto-fixed-reaction-bar-but-lets-hide-it-for-fun-23km</link>
      <guid>https://forem.com/ahmedmusallam/i-like-the-new-devto-fixed-reaction-bar-but-lets-hide-it-for-fun-23km</guid>
      <description>&lt;p&gt;I thought this was cool:&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/ben" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bgwIhvJ3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--1M1qt9Sp--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/1/f451a206-11c8-4e3d-8936-143d0a7e65bb.png" alt="ben image"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/ben/changelog-sticky-post-actions-ui-change-3i00" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Changelog: Sticky Post Actions UI Change&lt;/h2&gt;
      &lt;h3&gt;Ben Halpern ・ Sep 13 '18 ・ 1 min read&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#changelog&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#meta&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;But then I wondered what the experience would be like if the bottom bar slid down when you scroll down and showed back up when you scrolled up. So I looked up how I can make that happen. Easily, it turns out:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.w3schools.com/howto/howto_js_navbar_slide.asp"&gt;https://www.w3schools.com/howto/howto_js_navbar_slide.asp&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;now let's use that to make this happen:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CI1CpmcJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/yfwyss8z96a9im79s69g.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CI1CpmcJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/yfwyss8z96a9im79s69g.gif" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Made possible with &lt;a href="https://getkap.co/"&gt;https://getkap.co/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The code is really simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;initialScrollPos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pageYOffset&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;bar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;article-reaction-actions&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;transition&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bottom 0.25s&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onscroll&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;currentScrollPos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pageYOffset&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;initialScrollPos&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;currentScrollPos&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;// user scrolled down&lt;/span&gt;
    &lt;span class="nx"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bottom&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;// user scrolled up&lt;/span&gt;
    &lt;span class="nx"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bottom&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`-&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;offsetHeight&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;px`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// 80 is a number larger than the bar's height&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nx"&gt;initialScrollPos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;currentScrollPos&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;I am aware that this can be optimized, but it's only for illustration purposes :)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I don't know which one I like best... The transition is nice, but the fixed bar might be better to keep the reader focused on reading not looking at the bar moving. I'd love to hear your thoughts! &lt;/p&gt;

</description>
      <category>discuss</category>
      <category>meta</category>
    </item>
    <item>
      <title>How do you delegate work? especially to offshore developers?</title>
      <dc:creator>Ahmed Musallam</dc:creator>
      <pubDate>Mon, 10 Sep 2018 21:23:51 +0000</pubDate>
      <link>https://forem.com/ahmedmusallam/how-do-you-delegate-work-especially-to-offshore-developers-6fj</link>
      <guid>https://forem.com/ahmedmusallam/how-do-you-delegate-work-especially-to-offshore-developers-6fj</guid>
      <description>&lt;p&gt;I find it really hard to delegate work to my development team, especially offshore developers because of the time difference. I can't reach out to most of my team during my work hours and they can't reach out to me...&lt;/p&gt;

&lt;p&gt;Additionally, I keep looking at user stories and thinking: "I could do that myself, faster and exactly how I want it". But there are so many hours in a day and I keep restraining myself from taking on more work on my already full plate. Also, I recognize that if I did everything for my team, they miss on learning opportunities that I've enjoyed in the past.&lt;/p&gt;

&lt;p&gt;I wonder how other lead developers do it? Any techniques or practices that might help?  &lt;/p&gt;

</description>
      <category>discuss</category>
    </item>
    <item>
      <title>Bash from scratch: learn enough bash to write your own scripts</title>
      <dc:creator>Ahmed Musallam</dc:creator>
      <pubDate>Mon, 10 Sep 2018 18:24:02 +0000</pubDate>
      <link>https://forem.com/ahmedmusallam/bash-from-scratch-learn-enough-bash-to-write-your-own-scripts-189f</link>
      <guid>https://forem.com/ahmedmusallam/bash-from-scratch-learn-enough-bash-to-write-your-own-scripts-189f</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;You should probably read &lt;a href="https://dev.to/maxwell_dev"&gt;@maxwell_dev's&lt;/a&gt; post: &lt;a href="https://dev.to/maxwell_dev/the-shell-introduction-i-wish-i-had-551k"&gt;The Shell Introduction I Wish I Had&lt;/a&gt; before this&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I find myself always needing to write shell scripts, because they can be very handy to automate tasks. Or, most importantly, because I forget the full commands to do something and I don't want to keep looking up the docs; either because the docs suck, or I'm just lazy :)&lt;/p&gt;

&lt;p&gt;sometimes the commands I run are long or are just unfriendly. For example, this maven command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mvn clean &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-PautoInstallPackage&lt;/span&gt;,-codeQuality,-frontend &lt;span class="nt"&gt;-Dcrx&lt;/span&gt;.user&lt;span class="o"&gt;=&lt;/span&gt;user1 &lt;span class="nt"&gt;-Dcrx&lt;/span&gt;.password&lt;span class="o"&gt;=&lt;/span&gt;pass1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;this is unintuitive and I wanted something simpler like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./install &lt;span class="nt"&gt;-codeQuality&lt;/span&gt; &lt;span class="nt"&gt;-frontend&lt;/span&gt; &lt;span class="nt"&gt;--user&lt;/span&gt; user1 &lt;span class="nt"&gt;--password&lt;/span&gt; pass1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or shorter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./install &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; user1 &lt;span class="nt"&gt;-p&lt;/span&gt; pass1

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;at this point you might be thinking, how is this any better than the actual maven command? Well:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I add documentation to my &lt;code&gt;install&lt;/code&gt; script. And I print the documentation when I run &lt;code&gt;install help&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;My scripts print the full commands they execute.&lt;/li&gt;
&lt;li&gt;The command itself is part of the script, I can always look inside my script to find it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now that that's out of the way, lets learn some shell scripting! I'll be introducing you to a few things that'll get you writing scripts in no time!&lt;/p&gt;

&lt;h2&gt;
  
  
  The basics
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Creating an executable file
&lt;/h3&gt;

&lt;p&gt;In order to write a script and execute it, the script file must have execution &lt;a href="http://linuxcommand.org/lc3_lts0090.php"&gt;permission&lt;/a&gt;. So let's create a file and give it execution permission&lt;/p&gt;

&lt;p&gt;&lt;code&gt;cd&lt;/code&gt; into a test directory and run&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# create a new file called `script.sh`&lt;/span&gt;
&lt;span class="nb"&gt;touch &lt;/span&gt;script.sh
&lt;span class="c"&gt;# add `execution` permission to the script to make it executable &lt;/span&gt;
&lt;span class="nb"&gt;chmod&lt;/span&gt; +x script.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;to run the script, while in the same directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./script
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;the &lt;code&gt;./&lt;/code&gt; is necessary to tell your terminal to look in the current directory and not the default script directory.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;now open that file in your favorite editor and let's get to learning the syntax.&lt;/p&gt;

&lt;h3&gt;
  
  
  The &lt;a href="https://en.wikipedia.org/wiki/Shebang_%28Unix%29"&gt;shebang&lt;/a&gt;!
&lt;/h3&gt;

&lt;p&gt;TL;DR; add &lt;code&gt;#!/usr/bin/env bash&lt;/code&gt; in the first line of your script file to mark that file as a bash executable.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;you &lt;em&gt;could&lt;/em&gt; use &lt;code&gt;#!/usr/bin/env sh&lt;/code&gt; for &lt;a href="https://en.wikipedia.org/wiki/Shebang_(Unix)#Portability"&gt;portability&lt;/a&gt;, but we are working specifically with bash here.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  printing stuff
&lt;/h3&gt;

&lt;p&gt;to print things to the terminal, you can use &lt;a href="http://www.linfo.org/echo.html"&gt;&lt;code&gt;echo&lt;/code&gt;&lt;/a&gt; or &lt;a href="https://linuxconfig.org/bash-printf-syntax-basics-with-examples"&gt;&lt;code&gt;printf&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;echo&lt;/code&gt; is straightforward, it "echos" what you throw at it:&lt;/p&gt;

&lt;p&gt;for example lets make that &lt;code&gt;script.sh&lt;/code&gt;, from above, print "hello world"&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/usr/bin/env bash&lt;/span&gt;
&lt;span class="nb"&gt;echo &lt;/span&gt;hello world
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;run it: &lt;code&gt;./script.sh&lt;/code&gt; and it will print: &lt;code&gt;hello world&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;printf&lt;/code&gt; is used for printing and "formatting" strings, hence the &lt;code&gt;f&lt;/code&gt; at the end. a few simple examples can be found &lt;a href="https://linuxconfig.org/bash-printf-syntax-basics-with-examples"&gt;here&lt;/a&gt;&lt;br&gt;
The largest use-case for me is printing a new line using the new line specifier &lt;code&gt;\n&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/usr/bin/env bash&lt;/span&gt;
&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s2"&gt;"hello&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;world&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;prints:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;hello
world
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Comments
&lt;/h3&gt;

&lt;p&gt;Any line starting with &lt;code&gt;#&lt;/code&gt; is a comment.&lt;/p&gt;

&lt;h3&gt;
  
  
  Declaring Variables
&lt;/h3&gt;

&lt;p&gt;simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;MY_VARIABLE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"my value"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;IMPORTANT: no space before or after &lt;code&gt;=&lt;/code&gt;. Shell uses space as a delimiter for command arguments.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Parameter Expansion
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;see &lt;a href="https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html"&gt;this&lt;/a&gt; and &lt;a href="http://wiki.bash-hackers.org/syntax/pe"&gt;this&lt;/a&gt; to learn more.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  &lt;em&gt;referencing&lt;/em&gt; or substituting a variable:
&lt;/h4&gt;

&lt;p&gt;for example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/usr/bin/env bash&lt;/span&gt;

&lt;span class="nv"&gt;FAV_FRUIT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"apples"&lt;/span&gt;
&lt;span class="nb"&gt;echo &lt;/span&gt;FAV_FRUIT

&lt;span class="c"&gt;# prints `FAV_FRUIT`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;while:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/usr/bin/env bash&lt;/span&gt;

&lt;span class="nv"&gt;FAV_FRUIT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"apples"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$FAV_FRUIT&lt;/span&gt;

&lt;span class="c"&gt;# prints `apples`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;did you catch the difference? yes! &lt;code&gt;FAV_FRUIT&lt;/code&gt; vs &lt;code&gt;$FAV_FRUIT&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;you can also use &lt;code&gt;$&lt;/code&gt; in a string:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/usr/bin/env bash&lt;/span&gt;

&lt;span class="nv"&gt;FAV_FRUIT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"apples"&lt;/span&gt;
&lt;span class="nv"&gt;I_LIKE_BLANK&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"I like &lt;/span&gt;&lt;span class="nv"&gt;$FAV_FRUIT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$I_LIKE_BLANK&lt;/span&gt;

&lt;span class="c"&gt;# prints `I like apples`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Note: in all examples above, you can replace &lt;code&gt;$&lt;/code&gt; with &lt;code&gt;${variable name}&lt;/code&gt; for the same effect. so &lt;code&gt;$FAV_FRUIT&lt;/code&gt; is the same as &lt;code&gt;${FAV_FRUIT}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Second note: notice how we used &lt;code&gt;$FAV_FRUIT&lt;/code&gt; inside of a string? that's string templating for ya!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Using a default value
&lt;/h4&gt;

&lt;p&gt;if a variable is empty or undefined, use a certain default value. This is best illustrated with an example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/usr/bin/env bash&lt;/span&gt;

&lt;span class="nv"&gt;SHIRT_COLOR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;
&lt;span class="nv"&gt;COLOR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;SHIRT_COLOR&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;red&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$color&lt;/span&gt;

&lt;span class="c"&gt;# prints: `red` since SHIRT_COLOR is empty&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;another example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/usr/bin/env bash&lt;/span&gt;

&lt;span class="nv"&gt;DEFAULT_COLOR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"red"&lt;/span&gt;
&lt;span class="nv"&gt;SHIRT_COLOR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;
&lt;span class="nv"&gt;MY_SHIRT_COLOR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"My shirt color is &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;SHIRT_COLOR&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;$DEFAULT_COLOR&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$MY_SHIRT_COLOR&lt;/span&gt;


&lt;span class="c"&gt;# prints: `My shirt color is red`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Note: notice how we used &lt;code&gt;${SHIRT_COLOR:-$DEFAULT_COLOR}&lt;/code&gt; inside of a string? that's string templating for ya!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Passing variables to our script from terminal
&lt;/h3&gt;

&lt;p&gt;To pass a variable, you can declare it before running the script.&lt;br&gt;
This is especially helpful for passing environment variables. For example: the following script expects a &lt;code&gt;FRUIT&lt;/code&gt; and will print &lt;code&gt;I Like &amp;lt;FRUIT&amp;gt;&lt;/code&gt;. If &lt;code&gt;FRUIT&lt;/code&gt; is undefined, use &lt;code&gt;Apricot&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/usr/bin/env bash&lt;/span&gt;

&lt;span class="nv"&gt;DEFAULT_FRUIT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Apricot"&lt;/span&gt;
&lt;span class="nv"&gt;FRUIT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FRUIT&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;$DEFAULT_FRUIT&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"I Like &lt;/span&gt;&lt;span class="nv"&gt;$FRUIT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;now you declare &lt;code&gt;FRUIT="Oranges"&lt;/code&gt; before running &lt;code&gt;./script&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;FRUIT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Oranges"&lt;/span&gt; ./script
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;which prints: &lt;code&gt;I Like Oranges&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;since the default is &lt;code&gt;Apricot&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./script
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;prints: &lt;code&gt;I Like Apricot&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The More Advanced stuff
&lt;/h2&gt;

&lt;h3&gt;
  
  
  If Statements
&lt;/h3&gt;

&lt;h4&gt;
  
  
  The syntax
&lt;/h4&gt;

&lt;h5&gt;
  
  
  If then
&lt;/h5&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &amp;lt;some &lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
  &amp;lt;commands&amp;gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  If else
&lt;/h5&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &amp;lt;some &lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
  &amp;lt;commands&amp;gt;
&lt;span class="k"&gt;else&lt;/span&gt;
  &amp;lt;other commands&amp;gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  If elseif else
&lt;/h5&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &amp;lt;some &lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
  &amp;lt;commands&amp;gt;
&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &amp;lt;some &lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
  &amp;lt;different commands&amp;gt;
&lt;span class="k"&gt;else&lt;/span&gt;
  &amp;lt;other commands&amp;gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Tests
&lt;/h4&gt;

&lt;p&gt;in the above &lt;code&gt;&amp;lt;some test&amp;gt;&lt;/code&gt; can be replaced with a test condition. You can see all available &lt;code&gt;test&lt;/code&gt; conditions by typing &lt;code&gt;man test&lt;/code&gt; in your terminal&lt;/p&gt;

&lt;p&gt;Here are a few sample conditions that evaluate to true:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Test&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;[[2 -gt 1]]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2 is greater than 1. counterpart &lt;code&gt;-lt&lt;/code&gt;: less,than.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;[[2 -eq 2]]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2 equals 2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;[[3 -ge 3]]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;3 is greater than,or equal to 3. counterpart &lt;code&gt;-le&lt;/code&gt;: less than or equal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;[[-n "hello"]]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Length of "hello" is greater than 0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;[[-z ""]]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Length of "" is 0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;[["apple"= "apple"]]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;String,"apple" equals String "apple". (&lt;code&gt;-eq&lt;/code&gt; compares numbers while &lt;code&gt;=&lt;/code&gt; compares charachters)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;[["apple"!= "apple1"]]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;String,"apple" does no equal String "apple1"&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Examples using wildcards:&lt;br&gt;
    - &lt;code&gt;[[ "watermelon" = *"melon"* ]]&lt;/code&gt;: String "watermelon" contains "melon"&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Since this article is about &lt;code&gt;bash&lt;/code&gt; and not shell in general, we use bash's double square brackets &lt;code&gt;[[]]&lt;/code&gt;. Read &lt;a href="https://www.mkssoftware.com/docs/man1/test.1.asp"&gt;this&lt;/a&gt; and &lt;a href="https://stackoverflow.com/questions/2188199/how-to-use-double-or-single-brackets-parentheses-curly-braces"&gt;this answer&lt;/a&gt; for more information.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://linuxacademy.com/blog/linux/conditions-in-bash-scripting-if-statements/"&gt;this article&lt;/a&gt; is a good resource for further test conditions &lt;/p&gt;

&lt;p&gt;To continue with the spirit of examples and fruits, here is an example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/usr/bin/env bash&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="k"&gt;${#&lt;/span&gt;&lt;span class="nv"&gt;FRUIT&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="nt"&gt;-gt&lt;/span&gt; 4 &lt;span class="o"&gt;]]&lt;/span&gt;    &lt;span class="c"&gt;# FRUIT character count is greater than 4&lt;/span&gt;
&lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[&lt;/span&gt;&lt;span class="nv"&gt;$FRUIT&lt;/span&gt;&lt;span class="s2"&gt;]: yay! your fruit has more than 4 characters!"&lt;/span&gt;
&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="k"&gt;${#&lt;/span&gt;&lt;span class="nv"&gt;FRUIT&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="nt"&gt;-lt&lt;/span&gt; 4  &lt;span class="o"&gt;]]&lt;/span&gt; &lt;span class="c"&gt;# FRUIT character count is less than 4&lt;/span&gt;
&lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[&lt;/span&gt;&lt;span class="nv"&gt;$FRUIT&lt;/span&gt;&lt;span class="s2"&gt;]: Unbelievable... your fruit has less than 4 characters..."&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;                      &lt;span class="c"&gt;# FRUIT character count must be 4&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"A fruit with exactly 4 characters, how precious!"&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The following table shows the commands and the outputs for above script:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Output&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;FRUIT="Apple" ./script.sh&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[Apple]: yay! your fruit has more than 4 characters!&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;FRUIT="Fig" ./script.sh&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[Fig]: Unbelievable... your fruit has less than 4 characters...&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;FRUIT="Pear" ./script.sh&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;A fruit with exactly 4 characters, how precious!&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;Note the parameter expansion &lt;code&gt;${#FRUIT}&lt;/code&gt; gets the characters length of &lt;code&gt;FRUIT&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here are a few helpful operators &lt;/p&gt;

&lt;h3&gt;
  
  
  Parsing Arguments (&lt;code&gt;while&lt;/code&gt; and &lt;code&gt;case&lt;/code&gt; statements)
&lt;/h3&gt;

&lt;p&gt;This is probably going to be the best part. Now that you've learned a few cool tricks, let's look at passing arguments with some sort of API.&lt;/p&gt;

&lt;p&gt;Our goal in this section will be to create a script that will print information about a user. For example, the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./script &lt;span class="nt"&gt;--name&lt;/span&gt; Ahmed &lt;span class="nt"&gt;--height&lt;/span&gt; 6ft &lt;span class="nt"&gt;--occupation&lt;/span&gt; &lt;span class="s2"&gt;"Professional Procrastinator"&lt;/span&gt; &lt;span class="nt"&gt;--username&lt;/span&gt; coolestGuyEver23
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;which will print:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Hello, my name is Ahmed. I&lt;span class="s1"&gt;'m 6ft tall.
I work as a Professional Procrastinator and my username is coolestGuyEver23
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Note that order of arguments should not matter&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;let's get to it!&lt;/p&gt;

&lt;p&gt;first, we need a way to parse the arguments &lt;code&gt;--name Ahmed --height 6ft --occupation= Developer --username coolestGuyEver23&lt;/code&gt; to variables. see &lt;a href="https://stackoverflow.com/questions/192249/how-do-i-parse-command-line-arguments-in-bash"&gt;this SO answer&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;first let's look at bash's built in &lt;code&gt;$#&lt;/code&gt; and &lt;code&gt;shift&lt;/code&gt;&lt;br&gt;
&lt;code&gt;$#&lt;/code&gt; returns the number of arguments passed. for example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/usr/bin/env bash&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$#&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you run &lt;code&gt;./script arg1 arg2 arg3&lt;/code&gt;, the output would be &lt;code&gt;3&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_09_07.html"&gt;&lt;code&gt;shift&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The shift command is one of the Bourne shell built-ins that comes with Bash. This command takes one argument, a number. The positional parameters are shifted to the left by this number, N. The positional parameters from N+1 to $# are renamed to variable names from $1 to $# - N+1.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is better explained with an example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/usr/bin/env bash&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$#&lt;/span&gt;
&lt;span class="nb"&gt;shift &lt;/span&gt;2
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$#&lt;/span&gt;
&lt;span class="nb"&gt;shift
echo&lt;/span&gt; &lt;span class="nv"&gt;$#&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$@&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;running &lt;code&gt;./script arg1 arg2 arg3 arg4 arg5&lt;/code&gt; (total 5 arguments) prints:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;5
3
2
arg4 arg5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;huh? so &lt;code&gt;shift 2&lt;/code&gt; basically removed &lt;code&gt;arg1&lt;/code&gt; and &lt;code&gt;arg2&lt;/code&gt; then we executed &lt;code&gt;shift&lt;/code&gt; again and removed &lt;code&gt;arg3&lt;/code&gt;. &lt;em&gt;Note that &lt;code&gt;$@&lt;/code&gt;&lt;/em&gt; is another builtin that prints the arguments.&lt;/p&gt;

&lt;p&gt;Now is a good time to tell you how to access arguments sort-of like an array. You can use &lt;code&gt;$1&lt;/code&gt; for first arg, &lt;code&gt;$2&lt;/code&gt; for second arg, &lt;code&gt;$3&lt;/code&gt; for third arg.. and so on.&lt;/p&gt;

&lt;p&gt;example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/usr/bin/env bash&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$3&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./script arg1 arg2 arg3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;prints:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;arg1
arg3
arg2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;how do we use all that info? take a look at this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nv"&gt;$# &lt;/span&gt;&lt;span class="nt"&gt;-gt&lt;/span&gt; 0 &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
    &lt;/span&gt;&lt;span class="nv"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$key&lt;/span&gt;
    &lt;span class="nb"&gt;shift
&lt;/span&gt;&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It might have clicked by now! Using the &lt;code&gt;while&lt;/code&gt; loop above, with exit condition &lt;code&gt;[[ $# -gt 0 ]]&lt;/code&gt; and &lt;code&gt;shift&lt;/code&gt; to reduce &lt;code&gt;$#&lt;/code&gt; we can loop over all passed args!&lt;/p&gt;

&lt;p&gt;let's make it better with a case statement, let's start simple and parse &lt;code&gt;name&lt;/code&gt; and &lt;code&gt;height&lt;/code&gt; only&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/usr/bin/env bash&lt;/span&gt;

&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nv"&gt;$# &lt;/span&gt;&lt;span class="nt"&gt;-gt&lt;/span&gt; 0 &lt;span class="o"&gt;]]&lt;/span&gt;
&lt;span class="k"&gt;do
&lt;/span&gt;&lt;span class="nv"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nv"&gt;$key&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt;
    &lt;span class="c"&gt;# parse name arg&lt;/span&gt;
    &lt;span class="nt"&gt;-n&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="nt"&gt;--name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$2&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;   &lt;span class="c"&gt;# the value is right after the key&lt;/span&gt;
        &lt;span class="nb"&gt;shift&lt;/span&gt;       &lt;span class="c"&gt;# past argument (`--name`)&lt;/span&gt;
        &lt;span class="nb"&gt;shift&lt;/span&gt;       &lt;span class="c"&gt;# past value&lt;/span&gt;
    &lt;span class="p"&gt;;;&lt;/span&gt;
    &lt;span class="c"&gt;# parse height arg&lt;/span&gt;
    &lt;span class="nt"&gt;-h&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="nt"&gt;--height&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nv"&gt;HEIGHT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$2&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
        &lt;span class="nb"&gt;shift&lt;/span&gt; &lt;span class="c"&gt;# past argument&lt;/span&gt;
        &lt;span class="nb"&gt;shift&lt;/span&gt; &lt;span class="c"&gt;# past value&lt;/span&gt;
    &lt;span class="p"&gt;;;&lt;/span&gt;
    &lt;span class="c"&gt;# unknown option&lt;/span&gt;
    &lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Unknown argument: &lt;/span&gt;&lt;span class="nv"&gt;$key&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
        &lt;span class="nb"&gt;shift&lt;/span&gt; &lt;span class="c"&gt;# past argument&lt;/span&gt;
    &lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="k"&gt;esac&lt;/span&gt;
&lt;span class="k"&gt;done

&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"NAME: &lt;/span&gt;&lt;span class="nv"&gt;$NAME&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"HEIGHT: &lt;/span&gt;&lt;span class="nv"&gt;$HEIGHT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Notes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;each case is separated with a pipe &lt;code&gt;|&lt;/code&gt; for example &lt;code&gt;-n|--name)&lt;/code&gt; matches &lt;code&gt;-n&lt;/code&gt; OR &lt;code&gt;--name&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;we used &lt;code&gt;shift&lt;/code&gt; two times to move past the argument flag and the argument value&lt;/li&gt;
&lt;li&gt;More on &lt;a href="http://wiki.bash-hackers.org/syntax/ccmd/case"&gt;&lt;code&gt;case&lt;/code&gt; statement&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;We are exiting after finding the first match by using &lt;code&gt;;;&lt;/code&gt;. Matching unknown options is at the bottom.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;Rut it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./run.sh &lt;span class="nt"&gt;--name&lt;/span&gt; Ahmed &lt;span class="nt"&gt;--height&lt;/span&gt; 6ft
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or shorter&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./run.sh &lt;span class="nt"&gt;-n&lt;/span&gt; Ahmed &lt;span class="nt"&gt;-h&lt;/span&gt; 6ft
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;prints:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NAME: Ahmed
HEIGHT: 6ft
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;putting it all together:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/usr/bin/env bash&lt;/span&gt;

&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nv"&gt;$# &lt;/span&gt;&lt;span class="nt"&gt;-gt&lt;/span&gt; 0 &lt;span class="o"&gt;]]&lt;/span&gt;
&lt;span class="k"&gt;do
&lt;/span&gt;&lt;span class="nv"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nv"&gt;$key&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt;
    &lt;span class="c"&gt;# parse name arg&lt;/span&gt;
    &lt;span class="nt"&gt;-n&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="nt"&gt;--name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$2&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;   &lt;span class="c"&gt;# the value is right after the key&lt;/span&gt;
        &lt;span class="nb"&gt;shift&lt;/span&gt;       &lt;span class="c"&gt;# past argument (`--name`)&lt;/span&gt;
        &lt;span class="nb"&gt;shift&lt;/span&gt;       &lt;span class="c"&gt;# past value&lt;/span&gt;
    &lt;span class="p"&gt;;;&lt;/span&gt;
    &lt;span class="c"&gt;# parse height arg&lt;/span&gt;
    &lt;span class="nt"&gt;-h&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="nt"&gt;--height&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nv"&gt;HEIGHT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$2&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
        &lt;span class="nb"&gt;shift&lt;/span&gt;        &lt;span class="c"&gt;# past argument&lt;/span&gt;
        &lt;span class="nb"&gt;shift&lt;/span&gt;        &lt;span class="c"&gt;# past value&lt;/span&gt;
    &lt;span class="p"&gt;;;&lt;/span&gt;
    &lt;span class="c"&gt;# parse user arg&lt;/span&gt;
    &lt;span class="nt"&gt;-u&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="nt"&gt;--user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nv"&gt;USER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$2&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
        &lt;span class="nb"&gt;shift&lt;/span&gt; &lt;span class="c"&gt;# past argument&lt;/span&gt;
        &lt;span class="nb"&gt;shift&lt;/span&gt; &lt;span class="c"&gt;# past value&lt;/span&gt;
    &lt;span class="p"&gt;;;&lt;/span&gt;
    &lt;span class="c"&gt;# parse occupation argument&lt;/span&gt;
    &lt;span class="nt"&gt;-o&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="nt"&gt;--occupation&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nv"&gt;OCCUPATION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$2&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
        &lt;span class="nb"&gt;shift&lt;/span&gt; &lt;span class="c"&gt;# past argument&lt;/span&gt;
        &lt;span class="nb"&gt;shift&lt;/span&gt; &lt;span class="c"&gt;# past value&lt;/span&gt;
    &lt;span class="p"&gt;;;&lt;/span&gt;
    &lt;span class="c"&gt;# parse code quality argument&lt;/span&gt;
    &lt;span class="nt"&gt;-u&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="nt"&gt;--username&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nv"&gt;USERNAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$2&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
        &lt;span class="nb"&gt;shift&lt;/span&gt; &lt;span class="c"&gt;# past argument&lt;/span&gt;
        &lt;span class="nb"&gt;shift&lt;/span&gt; &lt;span class="c"&gt;# past value&lt;/span&gt;
    &lt;span class="p"&gt;;;&lt;/span&gt;
    &lt;span class="c"&gt;# unknown option&lt;/span&gt;
    &lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Unknown argument: &lt;/span&gt;&lt;span class="nv"&gt;$key&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
        &lt;span class="nb"&gt;shift&lt;/span&gt; &lt;span class="c"&gt;# past argument&lt;/span&gt;
    &lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="k"&gt;esac&lt;/span&gt;
&lt;span class="k"&gt;done

&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Hello, my name is &lt;/span&gt;&lt;span class="nv"&gt;$NAME&lt;/span&gt;&lt;span class="s2"&gt;. I'm &lt;/span&gt;&lt;span class="nv"&gt;$HEIGHT&lt;/span&gt;&lt;span class="s2"&gt; tall.
I work as a &lt;/span&gt;&lt;span class="nv"&gt;$OCCUPATION&lt;/span&gt;&lt;span class="s2"&gt; and my username is &lt;/span&gt;&lt;span class="nv"&gt;$USERNAME&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and run it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./run.sh &lt;span class="nt"&gt;--name&lt;/span&gt; ahmed &lt;span class="nt"&gt;--height&lt;/span&gt; 6ft &lt;span class="nt"&gt;--occupation&lt;/span&gt; &lt;span class="s2"&gt;"professional procrastinator"&lt;/span&gt; &lt;span class="nt"&gt;--username&lt;/span&gt; coolestGuyEver23
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./run.sh &lt;span class="nt"&gt;-n&lt;/span&gt; ahmed &lt;span class="nt"&gt;-h&lt;/span&gt; 6ft &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="s2"&gt;"professional procrastinator"&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; coolestGuyEver23
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;result:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hello, my name is ahmed. I'm 6ft tall.
I work as a professional procrastinator and my username is coolestGuyEver23
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Note, remember &lt;a href="https://dev.tousing-a-default-value"&gt;Using a default value&lt;/a&gt; section above? you can use that to add default values in case a param was not passed.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Evaluating Commands
&lt;/h3&gt;

&lt;p&gt;you can assemble a a command as a string then use &lt;code&gt;eval&lt;/code&gt; to execute it. For example, remember that long maven command from the beginning of the post?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mvn clean &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-PautoInstallPackage&lt;/span&gt; &lt;span class="nt"&gt;-Dcrx&lt;/span&gt;.user&lt;span class="o"&gt;=&lt;/span&gt;user1 &lt;span class="nt"&gt;-Dcrx&lt;/span&gt;.password&lt;span class="o"&gt;=&lt;/span&gt;pass1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can break that up and assemble it:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Assuming I already parsed &lt;code&gt;PROFILE&lt;/code&gt;, &lt;code&gt;USER&lt;/code&gt; and &lt;code&gt;PASSWORD&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;PROFILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PROFILE&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;autoInstallPackage&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;USER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;USER&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;user1&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PASSWORD&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;pass1&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="nv"&gt;COMMAND&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"mvn clean install -P&lt;/span&gt;&lt;span class="nv"&gt;$PROFILE&lt;/span&gt;&lt;span class="s2"&gt; -Dcrx.user=&lt;/span&gt;&lt;span class="nv"&gt;$USER&lt;/span&gt;&lt;span class="s2"&gt; -Dcrx.password=&lt;/span&gt;&lt;span class="nv"&gt;$PASSWORD&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="nv"&gt;$COMMAND&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and the command will be executed.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;eval&lt;/code&gt; might not be the best choice for all cases. It is completely fine in this case since I am the only one running the script and not the end users. So exercise caution when using &lt;code&gt;eval&lt;/code&gt;, in any programming language.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The script above can be re-written without &lt;code&gt;eval&lt;/code&gt; as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;PROFILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PROFILE&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;autoInstallPackage&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;USER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;USER&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;user1&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PASSWORD&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;pass1&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
mvn clean &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="s2"&gt;"-P&lt;/span&gt;&lt;span class="nv"&gt;$PROFILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"-Dcrx.user=&lt;/span&gt;&lt;span class="nv"&gt;$USER&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"-Dcrx.password=&lt;/span&gt;&lt;span class="nv"&gt;$PASSWORD&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Thanks &lt;a href="https://dev.to/lietux"&gt;@lietux&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Functions
&lt;/h3&gt;

&lt;p&gt;&lt;a href="http://tldp.org/LDP/abs/html/functions.html"&gt;Functions&lt;/a&gt; are simple and straightforward. Here is a function that prints the first argument passed to it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/usr/bin/env bash&lt;/span&gt;

printFirstOnly&lt;span class="o"&gt;(){&lt;/span&gt;
  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="c"&gt;# execute it&lt;/span&gt;
printFirstOnly hello world
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;prints &lt;code&gt;hello&lt;/code&gt; only &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Function arguments are accessed with the &lt;code&gt;$N&lt;/code&gt; variable where &lt;code&gt;N&lt;/code&gt; is the argument number.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I like to use functions to pretty print things:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pretty&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s2"&gt;"***&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;***&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

pretty &lt;span class="s2"&gt;"hi there"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;prints:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;***
hi there
***
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can use it for whatever purpose, however.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;If you've reached this, then I've done something right :) I'd love to hear your feedback on the post in general. Was it organized? scattered? did it make sense? was it helpful? and what can I do to improve it?&lt;/p&gt;

</description>
      <category>bash</category>
      <category>shell</category>
      <category>beginners</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
