{"id":235,"date":"2012-02-09T01:26:22","date_gmt":"2012-02-09T01:26:22","guid":{"rendered":"http:\/\/joelinoff.com\/blog\/?page_id=235"},"modified":"2026-06-28T17:38:49","modified_gmt":"2026-06-29T00:38:49","slug":"syntax-for-some-bash-and-tcsh-commands","status":"publish","type":"page","link":"https:\/\/joelinoff.com\/blog\/?page_id=235","title":{"rendered":"Translate between bash and tcsh commands"},"content":{"rendered":"<h2>Table of Contents<\/h2>\n<ol>\n  <li><a href=\"#tbl\">Bash\/Tcsh Comparison Table<\/a><\/li>\n  <li><a href=\"#gen\">How It Was Generated<\/a><\/li>\n  <li><a href=\"#make\">Makefile<\/a><\/li>\n  <li><a href=\"#genhtml\">Generate HTML (genhtml.py)<\/a><\/li>\n  <li><a href=\"#bash\">Bash Commands Script (compare.sh)<\/a><\/li>\n  <li><a href=\"#tcsh\">Tcsh Commands Script (compare.csh)<\/a><\/li>\n<\/ol>\n\n<a name=\"tbl\"><\/a>\n<h2>Bash\/Tcsh Comparison Table<\/h2>\nThe table below shows bash commands and their equivalents in tcsh along with the tools that I wrote to create it.\n\nI put it together because I sometimes have to switch between shells and needed a handy reference. It was built up over time by as I came across tidbits that I wanted to remember.\n\nIn some cases there are different ways of doing the same thing so I simply chose my preferred approach (such as [[]] expressions rather than [] in the if statements).\n\nI hope that you find it useful.\n    <style type=\"text\/css\">\n      table.mytable {\n        font-family: Arial, Helvetica; \n        font-size: 1.2em;\n        border-collapse: separate;\n        border-spacing: 1px;\n        *border-collapse: expression('separate', cellSpacing = '1px');\n        border: 2px solid lightgray;\n      }\n      tr.myrow-even {\n        vertical-align: top;\n        background-color: #ffffea;\n        border: 2px solid lightgray;\n      }\n      tr.myrow-odd {\n        vertical-align: top;\n        background-color: none;\n        border: 2px solid lightgray;\n      }\n      th.mycell-hdr {\n        vertical-align: top;\n        text-align: center;\n        padding: 4px 4px;\n        border: 2px solid lightgray;\n        \/*font-size: 1.3em;*\/\n      }\n      td.mycell-id {\n        vertical-align: top;\n        text-align: right;\n        padding: 2px 2px;\n        border: 1px solid lightgray;\n        font-size: 0.9em;\n        line-height: 100%;\n      }\n      td.mycell-title {\n        vertical-align: top;\n        text-align: left;\n        padding: 2px 2px;\n        border: 1px solid lightgray;\n        font-size: 0.9em;\n        line-height: 100%;\n      }\n      td.mycell-code {\n        vertical-align: top;\n        font-family: \"Courier New\", monospace; \n        text-align: left;\n        padding: 2px 2px;\n        border: 1px solid lightgray;\n        font-size: 0.9em;\n        line-height: 100%;\n      }\n      div#mydiv {\n        margin-left: -30px;\n        width: 110%;\n      }\n    <\/style>\n \n    <div id=\"mydiv\">\n      <table>\n        <thead>\n          <tr bgcolor=\"#DDDDDD\">\n            <th class=\"mycell-hdr\">ID<\/th> \n            <th class=\"mycell-hdr\">Operation<\/th> \n            <th class=\"mycell-hdr\">bash<\/th>\n            <th class=\"mycell-hdr\">tcsh<\/th>\n          <\/tr>\n        <\/thead>\n        <tbody>\n\n          <tr class=\"myrow-even\">\n            <td class=\"mycell-id\">1<\/td>\n            <td class=\"mycell-title\">alias<\/td>\n            <td class=\"mycell-code\">alias&nbsp;foo=bar<\/td>\n            <td class=\"mycell-code\">alias&nbsp;foo&nbsp;bar<\/td>\n          <\/tr>\n          <tr class=\"myrow-odd\">\n            <td class=\"mycell-id\">2<\/td>\n            <td class=\"mycell-title\">array: declaration<\/td>\n            <td class=\"mycell-code\">ARRAY=(&quot;a&quot;&nbsp;&quot;b&quot;&nbsp;&quot;c&quot;)<\/td>\n            <td class=\"mycell-code\">set&nbsp;ARRAY&nbsp;=&nbsp;(&quot;a&quot;&nbsp;&quot;b&quot;&nbsp;&quot;c&quot;)<\/td>\n          <\/tr>\n          <tr class=\"myrow-even\">\n            <td class=\"mycell-id\">3<\/td>\n            <td class=\"mycell-title\">array: first item<\/td>\n            <td class=\"mycell-code\">echo&nbsp;first&nbsp;item&nbsp;[0]&nbsp;=&nbsp;${ARRAY[0]}<\/td>\n            <td class=\"mycell-code\">echo&nbsp;&quot;first&nbsp;item&nbsp;[1]&nbsp;=&nbsp;$ARRAY[1]&quot;<\/td>\n          <\/tr>\n          <tr class=\"myrow-odd\">\n            <td class=\"mycell-id\">4<\/td>\n            <td class=\"mycell-title\">array: iterate by index<\/td>\n            <td class=\"mycell-code\">for&nbsp;i&nbsp;in&nbsp;${!ARRAY[@]};&nbsp;do<br \/>&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;&quot;%d&nbsp;%s\\n&quot;&nbsp;$i&nbsp;${ARRAY[i]}<br \/>done<\/td>\n            <td class=\"mycell-code\">foreach&nbsp;i&nbsp;(&nbsp;&#96;seq&nbsp;$#ARRAY&#96;&nbsp;)<br \/>&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;$i&nbsp;$ARRAY[$i]&nbsp;|\\<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;awk&nbsp;&apos;{printf(&quot;%d&nbsp;%s\\n&quot;,$1,$2);}&apos;<br \/>end<\/td>\n          <\/tr>\n          <tr class=\"myrow-even\">\n            <td class=\"mycell-id\">5<\/td>\n            <td class=\"mycell-title\">array: iterate by item<\/td>\n            <td class=\"mycell-code\">for&nbsp;item&nbsp;in&nbsp;${ARRAY[@]}&nbsp;;&nbsp;do<br \/>&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;item&nbsp;=&nbsp;$item<br \/>done<\/td>\n            <td class=\"mycell-code\">foreach&nbsp;item&nbsp;(&nbsp;$ARRAY&nbsp;)<br \/>&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;item&nbsp;=&nbsp;$item<br \/>end<\/td>\n          <\/tr>\n          <tr class=\"myrow-odd\">\n            <td class=\"mycell-id\">6<\/td>\n            <td class=\"mycell-title\">array: iterate by item, single line<\/td>\n            <td class=\"mycell-code\">A=(&quot;a&quot;&nbsp;&quot;b&quot;&nbsp;&quot;c&quot;)<br \/>for&nbsp;x&nbsp;in&nbsp;${A[@]}&nbsp;;&nbsp;do&nbsp;echo&nbsp;$x;&nbsp;done<\/td>\n            <td class=\"mycell-code\">N\/A<\/td>\n          <\/tr>\n          <tr class=\"myrow-even\">\n            <td class=\"mycell-id\">7<\/td>\n            <td class=\"mycell-title\">array: size<\/td>\n            <td class=\"mycell-code\">echo&nbsp;${#ARRAY[@]}&nbsp;items<\/td>\n            <td class=\"mycell-code\">echo&nbsp;$#ARRAY&nbsp;items<\/td>\n          <\/tr>\n          <tr class=\"myrow-odd\">\n            <td class=\"mycell-id\">8<\/td>\n            <td class=\"mycell-title\">command substitution<\/td>\n            <td class=\"mycell-code\">#&nbsp;style&nbsp;1&nbsp;&ndash;&nbsp;can&apos;t&nbsp;be&nbsp;nested<br \/>x=&#96;ls&nbsp;&ndash;1&#96;<br \/>#&nbsp;style&nbsp;2&nbsp;&ndash;&nbsp;can&nbsp;be&nbsp;nested<br \/>me=$(dirname&nbsp;&ndash;&ndash;&nbsp;$(readlink&nbsp;&ndash;f&nbsp;.))<br \/>echo&nbsp;$me<\/td>\n            <td class=\"mycell-code\">#&nbsp;style&nbsp;1&nbsp;&ndash;&nbsp;can&apos;t&nbsp;be&nbsp;nested<br \/>set&nbsp;x&nbsp;=&nbsp;&#96;ls&nbsp;&ndash;1&#96;<br \/>#&nbsp;style&nbsp;2&nbsp;&ndash;&nbsp;not&nbsp;supported<br \/>set&nbsp;r&nbsp;=&nbsp;&#96;readlink&nbsp;&ndash;f&nbsp;.&#96;<br \/>set&nbsp;me&nbsp;=&nbsp;&#96;dirname&nbsp;$r&#96;<br \/>echo&nbsp;$me<\/td>\n          <\/tr>\n          <tr class=\"myrow-even\">\n            <td class=\"mycell-id\">9<\/td>\n            <td class=\"mycell-title\">exit the shell<\/td>\n            <td class=\"mycell-code\">exit<br \/>exit&nbsp;1<\/td>\n            <td class=\"mycell-code\">exit<br \/>exit&nbsp;1<\/td>\n          <\/tr>\n          <tr class=\"myrow-odd\">\n            <td class=\"mycell-id\">10<\/td>\n            <td class=\"mycell-title\">formatted printing<\/td>\n            <td class=\"mycell-code\">#&nbsp;Native&nbsp;support.<br \/>printf&nbsp;&quot;%05d&nbsp;%s\\n&quot;&nbsp;42&nbsp;&quot;Deep&nbsp;Thought&quot;<\/td>\n            <td class=\"mycell-code\">#&nbsp;No&nbsp;native&nbsp;support,<br \/>#&nbsp;emulate&nbsp;with&nbsp;awk.<br \/>#&nbsp;Embedded&nbsp;spaces&nbsp;are&nbsp;a&nbsp;pain.<br \/>echo&nbsp;42&nbsp;&quot;Deep&nbsp;Thought&quot;&nbsp;|\\<br \/>&nbsp;&nbsp;awk&nbsp;&apos;{printf(&quot;%05d&nbsp;%s&nbsp;%s\\n&quot;,$1,$2,$3);&apos;}<\/td>\n          <\/tr>\n          <tr class=\"myrow-even\">\n            <td class=\"mycell-id\">11<\/td>\n            <td class=\"mycell-title\">function<\/td>\n            <td class=\"mycell-code\">function&nbsp;echo&ndash;cmds&nbsp;{<br \/>&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;&quot;CMD&nbsp;:&nbsp;&quot;$*<br \/>&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;Echo&nbsp;the&nbsp;commands.<br \/>&nbsp;&nbsp;&nbsp;&nbsp;local&nbsp;args=&quot;$@&quot;&nbsp;#&nbsp;local&nbsp;var<br \/>&nbsp;&nbsp;&nbsp;&nbsp;$args&nbsp;|&nbsp;sed&nbsp;&ndash;e&nbsp;&apos;s\/^\/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/&apos;<br \/>}<br \/>echo&ndash;cmds&nbsp;pwd<br \/>echo&ndash;cmds&nbsp;ls&nbsp;&ndash;l<\/td>\n            <td class=\"mycell-code\">N\/A<br \/>Can&nbsp;be&nbsp;emulated&nbsp;using<br \/>external&nbsp;scripts<\/td>\n          <\/tr>\n          <tr class=\"myrow-odd\">\n            <td class=\"mycell-id\">12<\/td>\n            <td class=\"mycell-title\">get shell name<\/td>\n            <td class=\"mycell-code\">echo&nbsp;$SHELL<\/td>\n            <td class=\"mycell-code\">echo&nbsp;$shell<\/td>\n          <\/tr>\n          <tr class=\"myrow-even\">\n            <td class=\"mycell-id\">13<\/td>\n            <td class=\"mycell-title\">get shell version<\/td>\n            <td class=\"mycell-code\">bash&nbsp;&ndash;&ndash;version<br \/>echo&nbsp;$BASH_VERSION<\/td>\n            <td class=\"mycell-code\">tcsh&nbsp;&ndash;&ndash;version<br \/>echo&nbsp;$version<\/td>\n          <\/tr>\n          <tr class=\"myrow-odd\">\n            <td class=\"mycell-id\">14<\/td>\n            <td class=\"mycell-title\">if\/then\/else: numeric<\/td>\n            <td class=\"mycell-code\">i=2<br \/>if&nbsp;((&nbsp;i&gt;2&nbsp;))&nbsp;;&nbsp;then<br \/>&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;i&nbsp;greater&nbsp;than&nbsp;2<br \/>elif&nbsp;((&nbsp;i&lt;2&nbsp;))&nbsp;;&nbsp;then<br \/>&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;i&nbsp;less&nbsp;than&nbsp;2<br \/>else<br \/>&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;i&nbsp;is&nbsp;two<br \/>fi<\/td>\n            <td class=\"mycell-code\">set&nbsp;i=2<br \/>if&nbsp;($i&gt;2)&nbsp;then<br \/>&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;i&nbsp;greater&nbsp;than&nbsp;2<br \/>else&nbsp;if&nbsp;($i&lt;2)&nbsp;then<br \/>&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;i&nbsp;less&nbsp;than&nbsp;2<br \/>else<br \/>&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;i&nbsp;is&nbsp;two<br \/>endif<\/td>\n          <\/tr>\n          <tr class=\"myrow-even\">\n            <td class=\"mycell-id\">15<\/td>\n            <td class=\"mycell-title\">if\/then\/else: string<\/td>\n            <td class=\"mycell-code\">s=&quot;foo&nbsp;bar&quot;<br \/>if&nbsp;[[&nbsp;&quot;$s&quot;&nbsp;==&nbsp;&quot;foo&nbsp;bar&quot;&nbsp;]]&nbsp;;&nbsp;then<br \/>&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;&quot;foo&quot;<br \/>else<br \/>&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;&quot;spam&quot;<br \/>fi<\/td>\n            <td class=\"mycell-code\">set&nbsp;s=&quot;foo&nbsp;bar&quot;<br \/>if&nbsp;(&quot;$s&quot;&nbsp;==&nbsp;&quot;foo&nbsp;bar&quot;)&nbsp;then<br \/>&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;&quot;foo&quot;<br \/>else<br \/>&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;&quot;spam&quot;<br \/>endif<\/td>\n          <\/tr>\n          <tr class=\"myrow-odd\">\n            <td class=\"mycell-id\">16<\/td>\n            <td class=\"mycell-title\">include a file<\/td>\n            <td class=\"mycell-code\">source&nbsp;include&ndash;file<br \/>.&nbsp;&nbsp;include&ndash;file<\/td>\n            <td class=\"mycell-code\">source&nbsp;include&ndash;file<\/td>\n          <\/tr>\n          <tr class=\"myrow-even\">\n            <td class=\"mycell-id\">17<\/td>\n            <td class=\"mycell-title\">IO: redirect stderr<\/td>\n            <td class=\"mycell-code\">ls&nbsp;2&gt;&nbsp;\/tmp\/$$<\/td>\n            <td class=\"mycell-code\">(&nbsp;ls&nbsp;&gt;&nbsp;\/dev\/tty&nbsp;)&nbsp;&gt;&amp;&nbsp;\/tmp\/$$<\/td>\n          <\/tr>\n          <tr class=\"myrow-odd\">\n            <td class=\"mycell-id\">18<\/td>\n            <td class=\"mycell-title\">IO: redirect stdout<\/td>\n            <td class=\"mycell-code\">ls&nbsp;&gt;&nbsp;\/tmp\/$$<\/td>\n            <td class=\"mycell-code\">ls&nbsp;&gt;&nbsp;\/tmp\/$$<\/td>\n          <\/tr>\n          <tr class=\"myrow-even\">\n            <td class=\"mycell-id\">19<\/td>\n            <td class=\"mycell-title\">IO: redirect stdout and stderr<\/td>\n            <td class=\"mycell-code\">ls&nbsp;&gt;&nbsp;\/tmp\/$$&nbsp;2&gt;&amp;1&nbsp;#&nbsp;older<br \/>ls&nbsp;&amp;&gt;&nbsp;\/tmp\/$$&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;newer<\/td>\n            <td class=\"mycell-code\">ls&nbsp;&gt;&amp;&nbsp;\/tmp\/$$<\/td>\n          <\/tr>\n          <tr class=\"myrow-odd\">\n            <td class=\"mycell-id\">20<\/td>\n            <td class=\"mycell-title\">job: move into the background<\/td>\n            <td class=\"mycell-code\">job<br \/>&lt;Ctrl&ndash;Z&gt;<br \/>bg<\/td>\n            <td class=\"mycell-code\">job<br \/>&lt;Ctrl&ndash;Z&gt;<br \/>bg<\/td>\n          <\/tr>\n          <tr class=\"myrow-even\">\n            <td class=\"mycell-id\">21<\/td>\n            <td class=\"mycell-title\">job: move into the foreground<\/td>\n            <td class=\"mycell-code\">fg<br \/>fg&nbsp;%1<\/td>\n            <td class=\"mycell-code\">fg<br \/>fg&nbsp;%1<\/td>\n          <\/tr>\n          <tr class=\"myrow-odd\">\n            <td class=\"mycell-id\">22<\/td>\n            <td class=\"mycell-title\">job: start in the background<\/td>\n            <td class=\"mycell-code\">job&nbsp;&amp;<\/td>\n            <td class=\"mycell-code\">job&nbsp;&amp;<\/td>\n          <\/tr>\n          <tr class=\"myrow-even\">\n            <td class=\"mycell-id\">23<\/td>\n            <td class=\"mycell-title\">job: status<\/td>\n            <td class=\"mycell-code\">job<br \/>echo&nbsp;status&nbsp;=&nbsp;$?<\/td>\n            <td class=\"mycell-code\">job<br \/>echo&nbsp;status&nbsp;=&nbsp;$?<\/td>\n          <\/tr>\n          <tr class=\"myrow-odd\">\n            <td class=\"mycell-id\">24<\/td>\n            <td class=\"mycell-title\">local variable<\/td>\n            <td class=\"mycell-code\">function&nbsp;fct&nbsp;{<br \/>&nbsp;&nbsp;&nbsp;&nbsp;local&nbsp;var=&apos;local&apos;<br \/>}<\/td>\n            <td class=\"mycell-code\">#&nbsp;functions&nbsp;not&nbsp;supported<\/td>\n          <\/tr>\n          <tr class=\"myrow-even\">\n            <td class=\"mycell-id\">25<\/td>\n            <td class=\"mycell-title\">prompt<\/td>\n            <td class=\"mycell-code\">set&nbsp;PS1=&apos;\\u&nbsp;&gt;&apos;&nbsp;&nbsp;#&nbsp;user&nbsp;name<br \/>set&nbsp;PS1=&apos;\\h&nbsp;&gt;&apos;&nbsp;&nbsp;#&nbsp;host<br \/>set&nbsp;PS1=&apos;\\!&nbsp;&gt;&apos;&nbsp;&nbsp;#&nbsp;command&nbsp;num<br \/>#set&nbsp;PS1=N\/A&nbsp;&gt;&apos;&nbsp;#&nbsp;last&nbsp;3&nbsp;dir&nbsp;parts<br \/>set&nbsp;PS1=&apos;\\W&nbsp;&gt;&apos;&nbsp;&nbsp;#&nbsp;last&nbsp;dir&nbsp;part<br \/>set&nbsp;PS1=&apos;\\w&nbsp;&gt;&apos;&nbsp;&nbsp;#&nbsp;curr&nbsp;dir&nbsp;full<br \/>set&nbsp;PS1=&apos;\\v&nbsp;&gt;&apos;&nbsp;&nbsp;#&nbsp;shell&nbsp;version<br \/>set&nbsp;PS1=&apos;\\u@\\h&nbsp;\\W&nbsp;(\\!)&nbsp;&gt;&apos;<\/td>\n            <td class=\"mycell-code\">set&nbsp;prompt=&apos;%n&nbsp;&gt;&apos;&nbsp;&nbsp;#&nbsp;user&nbsp;name<br \/>set&nbsp;prompt=&apos;%j&nbsp;&gt;&apos;&nbsp;&nbsp;#&nbsp;host<br \/>set&nbsp;prompt=&apos;!&nbsp;&gt;&apos;&nbsp;&nbsp;&nbsp;#&nbsp;command&nbsp;num<br \/>set&nbsp;prompt=&apos;%c3&nbsp;&gt;&apos;&nbsp;#&nbsp;last&nbsp;3&nbsp;dir&nbsp;parts<br \/>set&nbsp;prompt=&apos;%c&nbsp;&gt;&apos;&nbsp;&nbsp;#&nbsp;last&nbsp;dir&nbsp;part<br \/>set&nbsp;prompt=&apos;%~&nbsp;&gt;&apos;&nbsp;&nbsp;#&nbsp;curr&nbsp;dir&nbsp;full<br \/>#set&nbsp;prompt=N\/A&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;shell&nbsp;version<br \/>set&nbsp;prompt=&apos;%n@%j&nbsp;%c&nbsp;(!)&nbsp;&gt;&apos;<\/td>\n          <\/tr>\n          <tr class=\"myrow-odd\">\n            <td class=\"mycell-id\">26<\/td>\n            <td class=\"mycell-title\">range iteration<\/td>\n            <td class=\"mycell-code\">for&nbsp;i&nbsp;in&nbsp;&#96;seq&nbsp;1000&#96;&nbsp;;&nbsp;do<br \/>&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;$i<br \/>done<br \/><br \/>for&nbsp;i&nbsp;in&nbsp;$(&nbsp;seq&nbsp;1000&nbsp;)&nbsp;;&nbsp;do<br \/>&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;$i<br \/>done<br \/><br \/>#&nbsp;fastest<br \/>for&nbsp;i&nbsp;in&nbsp;{1..1000}&nbsp;;&nbsp;do<br \/>&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;$i<br \/>done<\/td>\n            <td class=\"mycell-code\">foreach&nbsp;i&nbsp;(&nbsp;&#96;seq&nbsp;1000&#96;&nbsp;)<br \/>&nbsp;&nbsp;echo&nbsp;$i<br \/>end<\/td>\n          <\/tr>\n          <tr class=\"myrow-even\">\n            <td class=\"mycell-id\">27<\/td>\n            <td class=\"mycell-title\">read values from the console<\/td>\n            <td class=\"mycell-code\">read&nbsp;&ndash;p&nbsp;&quot;login?&nbsp;&quot;&nbsp;login<br \/>read&nbsp;&ndash;p&nbsp;&quot;passwd?&nbsp;&quot;&nbsp;&ndash;s&nbsp;passwd<br \/>echo<br \/>echo&nbsp;&quot;login:&nbsp;$login&quot;<br \/>echo&nbsp;&quot;passwd:&nbsp;$passwd&quot;<\/td>\n            <td class=\"mycell-code\">echo&nbsp;&ndash;n&nbsp;&quot;login?&nbsp;&quot;<br \/>set&nbsp;login&nbsp;=&nbsp;$&lt;<br \/><br \/>echo&nbsp;&ndash;n&nbsp;&quot;passwd?&nbsp;&quot;<br \/>stty&nbsp;&ndash;echo<br \/>set&nbsp;passwd&nbsp;=&nbsp;$&lt;<br \/>stty&nbsp;echo<br \/><br \/>echo<br \/>echo&nbsp;&quot;login:&nbsp;$login&quot;<br \/>echo&nbsp;&quot;passwd:&nbsp;$passwd&quot;<\/td>\n          <\/tr>\n          <tr class=\"myrow-odd\">\n            <td class=\"mycell-id\">28<\/td>\n            <td class=\"mycell-title\">regex extension check<\/td>\n            <td class=\"mycell-code\">FILES=(&apos;f1.tar.bz2&apos;&nbsp;&apos;f2.tar.gz&apos;&nbsp;&apos;f3.zip&apos;)<br \/>for&nbsp;FILE&nbsp;in&nbsp;${FILES[@]}&nbsp;;&nbsp;do<br \/>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;[[&nbsp;&quot;$FILE&quot;&nbsp;=~&nbsp;.tar.bz2$&nbsp;]]&nbsp;;&nbsp;then<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;&quot;tar.bz2:&nbsp;$FILE&quot;<br \/>&nbsp;&nbsp;&nbsp;&nbsp;elif&nbsp;[[&nbsp;&quot;$FILE&quot;&nbsp;=~&nbsp;.tar.gz$&nbsp;]]&nbsp;;&nbsp;then<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;&quot;tar.gz:&nbsp;$FILE&quot;<br \/>&nbsp;&nbsp;&nbsp;&nbsp;elif&nbsp;[[&nbsp;&quot;$FILE&quot;&nbsp;=~&nbsp;.zip$&nbsp;]]&nbsp;;&nbsp;then<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;&quot;zip:&nbsp;$FILE&quot;<br \/>&nbsp;&nbsp;&nbsp;&nbsp;else<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;&quot;unk:&nbsp;$FILE&quot;<br \/>&nbsp;&nbsp;&nbsp;&nbsp;fi<br \/>done<\/td>\n            <td class=\"mycell-code\">set&nbsp;FILES=(&apos;f1.tar.bz2&apos;&nbsp;&apos;f2.tar.gz&apos;&nbsp;&apos;f3.zip&apos;)<br \/>foreach&nbsp;FILE&nbsp;(&nbsp;$FILES&nbsp;)<br \/>&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;$FILE&nbsp;|&nbsp;grep&nbsp;&apos;.tar.bz2$&apos;&nbsp;&gt;&amp;\/dev\/null<br \/>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(&nbsp;$?&nbsp;==&nbsp;0&nbsp;)&nbsp;then<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;&quot;tar.bz2:&nbsp;$FILE&quot;<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue<br \/>&nbsp;&nbsp;&nbsp;&nbsp;endif<br \/><br \/>&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;$FILE&nbsp;|&nbsp;grep&nbsp;&apos;.tar.gz$&apos;&nbsp;&gt;&amp;\/dev\/null<br \/>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(&nbsp;$?&nbsp;==&nbsp;0&nbsp;)&nbsp;then<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;&quot;tar.gz:&nbsp;$FILE&quot;<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue<br \/>&nbsp;&nbsp;&nbsp;&nbsp;endif<br \/><br \/>&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;$FILE&nbsp;|&nbsp;grep&nbsp;&apos;.zip$&apos;&nbsp;&gt;&amp;\/dev\/null<br \/>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(&nbsp;$?&nbsp;==&nbsp;0&nbsp;)&nbsp;then<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;&quot;zip:&nbsp;$FILE&quot;<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue<br \/>&nbsp;&nbsp;&nbsp;&nbsp;endif<br \/><br \/>&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;&quot;unk:&nbsp;$FILE&quot;<br \/>end<\/td>\n          <\/tr>\n          <tr class=\"myrow-even\">\n            <td class=\"mycell-id\">29<\/td>\n            <td class=\"mycell-title\">set path variable<\/td>\n            <td class=\"mycell-code\">export&nbsp;PATH=&quot;$PATH:\/tmp&quot;<\/td>\n            <td class=\"mycell-code\">set&nbsp;path&nbsp;=&nbsp;(&nbsp;$path&nbsp;\/tmp&nbsp;)<\/td>\n          <\/tr>\n          <tr class=\"myrow-odd\">\n            <td class=\"mycell-id\">30<\/td>\n            <td class=\"mycell-title\">set resource limits<\/td>\n            <td class=\"mycell-code\">ulimit<\/td>\n            <td class=\"mycell-code\">limit<\/td>\n          <\/tr>\n          <tr class=\"myrow-even\">\n            <td class=\"mycell-id\">31<\/td>\n            <td class=\"mycell-title\">setenv\/export<\/td>\n            <td class=\"mycell-code\">export&nbsp;FOOBAR=&quot;spam&quot;<\/td>\n            <td class=\"mycell-code\">setenv&nbsp;FOOBAR&nbsp;&quot;spam&quot;<\/td>\n          <\/tr>\n          <tr class=\"myrow-odd\">\n            <td class=\"mycell-id\">32<\/td>\n            <td class=\"mycell-title\">switch statement<\/td>\n            <td class=\"mycell-code\">arg=&quot;foo&quot;<br \/>case&nbsp;&quot;$arg&quot;&nbsp;in<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&quot;foo&quot;)<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;&quot;do&nbsp;foo&quot;<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&quot;bar&quot;)<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;&quot;do&nbsp;bar&quot;<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&quot;spam&quot;)<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;&quot;do&nbsp;spam&quot;<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;<br \/>&nbsp;&nbsp;&nbsp;&nbsp;*)<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;&quot;do&nbsp;be&nbsp;do&nbsp;be&nbsp;do&quot;<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;<br \/>esac<\/td>\n            <td class=\"mycell-code\">set&nbsp;arg=&quot;foo&quot;<br \/>switch&nbsp;(&quot;$arg&quot;)<br \/>&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;&quot;foo&quot;:<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;&quot;do&nbsp;foo&quot;<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;breaksw<br \/>&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;&quot;bar&quot;:<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;&quot;do&nbsp;bar&quot;<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;breaksw<br \/>&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;&quot;spam&quot;:<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;&quot;do&nbsp;spam&quot;<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;breaksw<br \/>&nbsp;&nbsp;&nbsp;&nbsp;default:<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;&quot;do&nbsp;be&nbsp;do&nbsp;be&nbsp;do&quot;<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;breaksw<br \/>endsw<\/td>\n          <\/tr>\n          <tr class=\"myrow-even\">\n            <td class=\"mycell-id\">33<\/td>\n            <td class=\"mycell-title\">variable: auto decrement<\/td>\n            <td class=\"mycell-code\">i=0<br \/>((&nbsp;i&ndash;&ndash;&nbsp;))<br \/>echo&nbsp;auto&nbsp;deccrement&nbsp;=&nbsp;$i<\/td>\n            <td class=\"mycell-code\">set&nbsp;i=0<br \/>@&nbsp;i&ndash;&ndash;<br \/>echo&nbsp;auto&nbsp;decrement&nbsp;=&nbsp;$i<\/td>\n          <\/tr>\n          <tr class=\"myrow-odd\">\n            <td class=\"mycell-id\">34<\/td>\n            <td class=\"mycell-title\">variable: auto increment<\/td>\n            <td class=\"mycell-code\">i=0<br \/>((&nbsp;i++&nbsp;))<br \/>echo&nbsp;auto&nbsp;increment&nbsp;=&nbsp;$i<\/td>\n            <td class=\"mycell-code\">set&nbsp;i=0<br \/>@&nbsp;i++<br \/>echo&nbsp;auto&nbsp;increment&nbsp;=&nbsp;$i<\/td>\n          <\/tr>\n          <tr class=\"myrow-even\">\n            <td class=\"mycell-id\">35<\/td>\n            <td class=\"mycell-title\">variable: automatically exit on error<\/td>\n            <td class=\"mycell-code\">\/bin\/bash&nbsp;&ndash;e&nbsp;#&nbsp;invocation<br \/>set&nbsp;&ndash;e&nbsp;#&nbsp;inside&nbsp;the&nbsp;shell<\/td>\n            <td class=\"mycell-code\">\/bin\/tcsh&nbsp;&ndash;e&nbsp;#&nbsp;invocation&nbsp;only<\/td>\n          <\/tr>\n          <tr class=\"myrow-odd\">\n            <td class=\"mycell-id\">36<\/td>\n            <td class=\"mycell-title\">variable: create array<\/td>\n            <td class=\"mycell-code\">ARRAY=(&quot;item1&quot;&nbsp;&quot;item2&quot;&nbsp;&quot;item2&quot;)<\/td>\n            <td class=\"mycell-code\">set&nbsp;ARRAY=(&quot;item1&quot;&nbsp;&quot;item2&quot;&nbsp;&quot;item2&quot;)<\/td>\n          <\/tr>\n          <tr class=\"myrow-even\">\n            <td class=\"mycell-id\">37<\/td>\n            <td class=\"mycell-title\">variable: create scalar<\/td>\n            <td class=\"mycell-code\">i=0<br \/>s=&quot;foo&nbsp;bar&nbsp;spam&quot;<\/td>\n            <td class=\"mycell-code\">set&nbsp;i=0<br \/>set=&quot;foo&nbsp;bar&nbsp;spam&quot;<\/td>\n          <\/tr>\n          <tr class=\"myrow-odd\">\n            <td class=\"mycell-id\">38<\/td>\n            <td class=\"mycell-title\">variable: debug tracing<\/td>\n            <td class=\"mycell-code\">set&nbsp;&ndash;x&nbsp;#&nbsp;on<br \/>pwd<br \/>set&nbsp;+x&nbsp;#&nbsp;off<br \/>pwd<\/td>\n            <td class=\"mycell-code\">set&nbsp;verbose&nbsp;#&nbsp;on<br \/>pwd<br \/>unset&nbsp;verbose&nbsp;#&nbsp;off<br \/>pwd<\/td>\n          <\/tr>\n          <tr class=\"myrow-even\">\n            <td class=\"mycell-id\">39<\/td>\n            <td class=\"mycell-title\">variable: destroy or unset<\/td>\n            <td class=\"mycell-code\">ARRAY=(&quot;item1&quot;&nbsp;&quot;item2&quot;&nbsp;&quot;item2&quot;)<br \/>unset&nbsp;ARRAY<\/td>\n            <td class=\"mycell-code\">set&nbsp;ARRAY=(&quot;item1&quot;&nbsp;&quot;item2&quot;&nbsp;&quot;item2&quot;)<br \/>unset&nbsp;ARRAY<\/td>\n          <\/tr>\n          <tr class=\"myrow-odd\">\n            <td class=\"mycell-id\">40<\/td>\n            <td class=\"mycell-title\">variable: dump state<\/td>\n            <td class=\"mycell-code\">set<\/td>\n            <td class=\"mycell-code\">set<\/td>\n          <\/tr>\n          <tr class=\"myrow-even\">\n            <td class=\"mycell-id\">41<\/td>\n            <td class=\"mycell-title\">variable: dynamic<\/td>\n            <td class=\"mycell-code\">#&nbsp;Native&nbsp;support,&nbsp;can&nbsp;also&nbsp;use&nbsp;eval.<br \/>a=&quot;some&nbsp;value&quot;<br \/>b=a<br \/>echo&nbsp;$b&nbsp;=&nbsp;${!b}<br \/>bv=&quot;${!b}&quot;<br \/>echo&nbsp;bv&nbsp;=&nbsp;$bv<\/td>\n            <td class=\"mycell-code\">#&nbsp;Not&nbsp;native,&nbsp;need&nbsp;to&nbsp;use&nbsp;eval.<br \/>set&nbsp;a=&quot;some&nbsp;value&quot;<br \/>set&nbsp;b=&quot;a&quot;<br \/>eval&nbsp;&quot;echo&nbsp;$b&nbsp;=&nbsp;&quot;&apos;$&apos;${b}<br \/>set&nbsp;bv=&#96;eval&nbsp;echo&nbsp;&apos;$&apos;$b&#96;<br \/>echo&nbsp;bv&nbsp;=&nbsp;$bv<\/td>\n          <\/tr>\n          <tr class=\"myrow-odd\">\n            <td class=\"mycell-id\">42<\/td>\n            <td class=\"mycell-title\">variable: print environment variables<\/td>\n            <td class=\"mycell-code\">env<br \/>printenv<\/td>\n            <td class=\"mycell-code\">env<br \/>printenv<\/td>\n          <\/tr>\n          <tr class=\"myrow-even\">\n            <td class=\"mycell-id\">43<\/td>\n            <td class=\"mycell-title\">variable: substitution<\/td>\n            <td class=\"mycell-code\">foo=&apos;bar&apos;<br \/>echo&nbsp;${foo\/bar\/baz\/}<\/td>\n            <td class=\"mycell-code\">set&nbsp;foo&nbsp;=&nbsp;&apos;bar&apos;<br \/>echo&nbsp;$foo:s\/bar\/baz\/<\/td>\n          <\/tr>\n          <tr class=\"myrow-odd\">\n            <td class=\"mycell-id\">44<\/td>\n            <td class=\"mycell-title\">variable: turn on unset variable checking<\/td>\n            <td class=\"mycell-code\">set&nbsp;&ndash;u<\/td>\n            <td class=\"mycell-code\">N\/A<\/td>\n          <\/tr>\n\n        <\/tbody>\n      <\/table>\n    <\/div>\n\n<a name=\"gen\"><\/a>\n<h2>How It Was Generated<\/h2>\n<p>\nThe table was generated automatically from two test scripts: a bash script (<a href=\"#bash\">compare.sh<\/a>) and a tcsh script (<a href=\"#tcsh\">compare.csh<\/a>). Each one ran all of the commands in the previous table.\n\nI used another script (<a href=\"#genhtml\">genhtml.py<\/a>) to parse them and generate this table automatically under the control of a Makefile. See the comments in the python script for more\ndetails about the record format. Here is how I ran it.\n\n\n<pre class=\"wp-block-code language-bash\"><code class=\"language-bash\">$ ls -l compare*\n-rwxr-xr-x  1 jlinoff  staff   4306 Nov 20 22:03 compare.csh*\n-rwxr-xr-x  1 jlinoff  staff   4214 Nov 20 22:04 compare.sh*\n$ make\numask 0; .\/genhtml.py compare.sh compare.csh &gt;compare.html<\/code><\/pre>\n\n<\/p>\n\nI then manually entered the HTML table data onto this page.\n\n<a name=\"make\"><\/a>\n<h2>Makefile<\/h2>\n<p>\nThis is the make file that I used.\n<\/p>\n\n<pre class=\"wp-block-code language-make\"><code class=\"language-make\"># Generate the bash\/tcsh comparison table.\n\nall: compare.html\n\nclean:\n\trm -rf *~ *.html\n\ncompare.html: genhtml.py compare.sh compare.csh\n\tumask 0; .\/genhtml.py compare.sh compare.csh &gt;$@<\/code><\/pre>\n\n\n<a name=\"genhtml\"><\/a>\n<h2>Generate HTML (genhtml.py)<\/h2>\n<p>\nThis is the python script file that generated the HTML table data.\n<\/p>\n\n<pre class=\"wp-block-code language-python\"><code class=\"language-python\">#!\/usr\/bin\/env python\n'''\nRead two shell files with specific formatting to parse out \ncommon records and produce and HTML table.\n\nIt is used to extract the common records from a bash shell script file\nand tcsh shell script file.\n\nThe idea is to create records in the bash and tcsh files with the same\nid so that this script can scoop them up and put them in a table.\n\nRecords are surrounded by:\n\n  # BEGIN: &lt;id&gt;\n  &lt;statements&gt;\n  # END\n\nThe id can be any string but it must be the same in both files.\nAnything in between is printed.\n\nTHe #@@ token is used to specify non-executing records.\n\nHere is a simple example:\n\n   $ # ================================================================\n   $ # bash commands\n   $ # ================================================================\n   $ cat compare.sh &lt;&lt;EOF\n   #!\/bin\/bash\n\n   # BEGIN: alias\n   alias foo=bar\n   # END\n\n   # BEGIN: array: iterate by item, single line\n   A=(\"a\" \"b\" \"c\")\n   for x in ${A[@]} ; do echo $x; done\n   # END\n\n   # BEGIN: array: iterate by index\n   for i in ${!ARRAY[@]}; do\n       printf \"%d %s\\n\" $i ${ARRAY[i]}\n   done\n   # END\n   EOF\n\n   $ # ================================================================\n   $ # tcsh commands\n   $ # ================================================================\n   $ cat compare.csh &lt;&lt;EOF\n   # BEGIN: alias\n   alias foo bar\n   # END\n\n   # BEGIN: array: iterate by item, single line\n   #@@ N\/A\n   # END\n\n   # BEGIN: array: iterate by index\n   foreach i ( `seq $#ARRAY` )\n       echo $i $ARRAY[$i] |\\\n           awk '{printf(\"%d %s\\n\",$1,$2);}'\n   end\n   # END\n   EOF\n\n   $ # ================================================================\n   $ # Generate the HTML.\n   $ # ================================================================\n   $ .\/genhtml.py compare.sh compare.csh &gt; compare.html\n'''\nimport sys\nimport os\nimport re\n\n\n# ================================================================\n# err\n# ================================================================\ndef err(msg):\n    '''\n    Print an error message and exit.\n    '''\n    print('ERROR: %s' % (msg))\n    sys.exit(1)\n\n\n# ================================================================\n# err\n# ================================================================\ndef parse(fn):\n    '''\n    Parse a shell script file looking for specific format\n    instructions in the comments.\n    '''\n    fp = open(fn,'r')\n    rows = {}\n    row = None\n    n=0\n    for line in fp.readlines():\n        n += 1\n        line = line.rstrip()\n\n        # begin\n        m = re.search('^# BEGIN: (.+)$',line)\n        if m:\n            if row != None:\n                err('missing END statement around line: %d in %s' % (n,fn))\n\n            title = m.group(1)\n            if title in rows:\n                err('duplicate entry \"%s\" at line %d in %s' % (title,n,fn))\n\n            row = {'title':title,\n                   'file':fn,\n                   'lineno':n,\n                   'lines':[],\n                   }\n            continue\n\n        # end\n        m = re.search('^# END',line)\n        if m:\n            rows[title]=row\n            row = None\n            continue\n\n        # between begin and end, everything else is ignored\n        if row:\n            row['lines'].append(line)\n\n    fp.close()\n    return rows\n\n\n# ================================================================\n# htmlize\n# ================================================================\ndef htmlize(line):\n    '''\n    HTMLize a string.\n    '''\n    line = line.replace('&amp;','&amp;')\n    line = line.replace('\"','\"')\n    line = line.replace(\"'\",''')\n    line = line.replace('&lt;','&lt;')\n    line = line.replace('&gt;','&gt;')\n    line = line.replace(' ','')\n    line = line.replace('`','`')\n    line = line.replace('-','\u2013')\n    return line\n\n# ================================================================\n# myprint\n# ================================================================\ndef myprint(m):\n    '''\n    Write a string to stdout.\n    '''\n    sys.stdout.write(str(m))\n\n\n# ================================================================\n# cell\n# ================================================================\ndef cell(indent, rec):\n    '''\n    Write out a column cell.\n    '''\n    myprint('%s&lt;td class=\"mycell-code\"&gt;' % (indent))\n    first=True\n    for line in rec['lines']:\n        if not first:\n            myprint('\n')\n        first = False\n        line = line.replace('#@@ ','')\n        myprint(htmlize(line))\n\n    myprint('&lt;\/td&gt;\\n')\n\n\n# ================================================================\n# gencss\n# ================================================================\ndef gencss():\n    '''\n    Generate the CSS styling information specifically for\n    wordpress.\n    '''\n\n    css ='''\n    &lt;style type=\"text\/css\"&gt;\n      table.mytable {\n        font-family: Arial, Helvetica; \n        font-size: 1.2em;\n        border-collapse: separate;\n        border-spacing: 1px;\n        *border-collapse: expression('separate', cellSpacing = '1px');\n        border: 2px solid lightgray;\n      }\n      tr.myrow-even {\n        vertical-align: top;\n        background-color: #ffffea;\n        border: 2px solid lightgray;\n      }\n      tr.myrow-odd {\n        vertical-align: top;\n        background-color: none;\n        border: 2px solid lightgray;\n      }\n      th.mycell-hdr {\n        vertical-align: top;\n        text-align: center;\n        padding: 4px 4px;\n        border: 2px solid lightgray;\n        \/*font-size: 1.3em;*\/\n      }\n      td.mycell-id {\n        vertical-align: top;\n        text-align: right;\n        padding: 2px 2px;\n        border: 1px solid lightgray;\n        font-size: 0.9em;\n        line-height: 100%;\n      }\n      td.mycell-title {\n        vertical-align: top;\n        text-align: left;\n        padding: 2px 2px;\n        border: 1px solid lightgray;\n        font-size: 0.9em;\n        line-height: 100%;\n      }\n      td.mycell-code {\n        vertical-align: top;\n        font-family: \"Courier New\", monospace; \n        text-align: left;\n        padding: 2px 2px;\n        border: 1px solid lightgray;\n        font-size: 0.9em;\n        line-height: 100%;\n      }\n      div#mydiv {\n        margin-left: -30px;\n        width: 110%;\n      }\n    &lt;\/style&gt;\n '''\n    return css\n\n# ================================================================\n# main\n# ================================================================\ndef main():\n    '''\n    Main entry point.\n    '''\n    # This is a simple script, no need for fancy argument handling.\n    assert len(sys.argv) == 3\n\n    bash_shell = sys.argv[1]\n    tcsh_shell = sys.argv[2]\n\n    bash_recs = parse(bash_shell)\n    tcsh_recs = parse(tcsh_shell)\n\n    if len(bash_recs) != len(tcsh_recs):\n        err('Mismatched number of records: %d != %d' % (len(bash_recs),\n                                                        len(tcsh_recs)))\n\n    for title in sorted(bash_recs):\n        if title not in tcsh_recs:\n            err('missing entry \"%s\"' % (title))\n\n    myprint(gencss())\n    print '''\n    &lt;div id=\"mydiv\"&gt;\n      &lt;table&gt;\n        &lt;thead&gt;\n          &lt;tr bgcolor=\"#DDDDDD\"&gt;\n            &lt;th class=\"mycell-hdr\"&gt;ID&lt;\/th&gt; \n            &lt;th class=\"mycell-hdr\"&gt;Operation&lt;\/th&gt; \n            &lt;th class=\"mycell-hdr\"&gt;bash&lt;\/th&gt;\n            &lt;th class=\"mycell-hdr\"&gt;tcsh&lt;\/th&gt;\n          &lt;\/tr&gt;\n        &lt;\/thead&gt;\n        &lt;tbody&gt;\n'''\n    tr_indent = '          '\n    td_indent = tr_indent + '  '\n    i=0\n    for title in sorted(bash_recs, key=lambda x: x.lower()):\n        bash_rec=bash_recs[title]\n        tcsh_rec=tcsh_recs[title]\n\n        if (i%2) == 0:\n            myprint('%s&lt;tr class=\"myrow-even\"&gt;\\n' % (tr_indent))\n        else:\n            myprint('%s&lt;tr class=\"myrow-odd\"&gt;\\n' % (tr_indent))\n        myprint('%s&lt;td class=\"mycell-id\"&gt;%d&lt;\/td&gt;\\n' % (td_indent, i+1))\n        myprint('%s&lt;td class=\"mycell-title\"&gt;%s&lt;\/td&gt;\\n' % (td_indent, title))\n        cell(td_indent, bash_rec)\n        cell(td_indent, tcsh_rec)\n        myprint('%s&lt;\/tr&gt;\\n' % (tr_indent))\n        i += 1\n\n    print '''\n        &lt;\/tbody&gt;\n      &lt;\/table&gt;\n    &lt;\/div&gt;\n'''\n\nif __name__ == '__main__':\n    main()<\/code><\/pre>\n\n\n<a name=\"bash\"><\/a>\n<h2>Bash Commands Script (compare.sh)<\/h2>\n<p>\nThis is the script that tested the bash commands.\n<\/p>\n\n<pre class=\"wp-block-code language-bash\"><code class=\"language-bash\">#!\/bin\/bash\n\n# BEGIN: alias\nalias foo=bar\n# END\n\n# BEGIN: array: declaration\nARRAY=(\"a\" \"b\" \"c\")\n# END\n\n# BEGIN: array: size\necho ${#ARRAY[@]} items\n# END\n\n# BEGIN: array: first item\necho first item [0] = ${ARRAY[0]}\n# END\n\n# BEGIN: array: iterate by item\nfor item in ${ARRAY[@]} ; do\n    echo item = $item\ndone\n# END\n\n# BEGIN: array: iterate by item, single line\nA=(\"a\" \"b\" \"c\")\nfor x in ${A[@]} ; do echo $x; done\n# END\n\n# BEGIN: array: iterate by index\nfor i in ${!ARRAY[@]}; do\n    printf \"%d %s\\n\" $i ${ARRAY[i]}\ndone\n# END\n\n# BEGIN: variable: create scalar\ni=0\ns=\"foo bar spam\"\n# END\n\n# BEGIN: variable: create array\nARRAY=(\"item1\" \"item2\" \"item2\")\n# END\n\n# BEGIN: variable: destroy or unset\nARRAY=(\"item1\" \"item2\" \"item2\")\nunset ARRAY\n# END\n\n# BEGIN: variable: auto increment\ni=0\n(( i++ ))\necho auto increment = $i\n# END\n\n# BEGIN: variable: auto decrement\ni=0\n(( i-- ))\necho auto deccrement = $i\n# END\n\n# BEGIN: function\nfunction echo-cmds {\n    echo \"CMD : \"$*\n    # Echo the commands.\n    local args=\"$@\" # local var\n    $args | sed -e 's\/^\/      \/'\n}\necho-cmds pwd\necho-cmds ls -l\n# END\n\n# BEGIN: job: start in the background\n#@@ job &amp;\n# END\n\n# BEGIN: job: move into the background\n#@@ job\n#@@ &lt;Ctrl-Z&gt;\n#@@ bg\n# END\n\n# BEGIN: job: status\n#@@ job\n#@@ echo status = $?\n# END\n\n# BEGIN: variable: debug tracing\nset -x # on\npwd\nset +x # off\npwd\n# END\n\n# BEGIN: variable: dump state\nset\n# END\n\n# BEGIN: variable: turn on unset variable checking\nset -u\n# END\nset +u\n\n# BEGIN: variable: automatically exit on error\n#@@ \/bin\/bash -e # invocation\nset -e # inside the shell\n# END\nset +e\n\n# BEGIN: variable: print environment variables\nenv\nprintenv\n# END\n\n# BEGIN: variable: dynamic\n# Native support, can also use eval.\na=\"some value\"\nb=a\necho $b = ${!b}\nbv=\"${!b}\"\necho bv = $bv\n# END\n\n# BEGIN: IO: redirect stdout\nls &gt; \/tmp\/$$\n# END\n\n# BEGIN: IO: redirect stderr\nls 2&gt; \/tmp\/$$\n# END\n\n# BEGIN: IO: redirect stdout and stderr\nls &gt; \/tmp\/$$ 2&gt;&amp;1 # older\nls &amp;&gt; \/tmp\/$$     # newer\n# END\n\n# BEGIN: exit the shell\n#@@ exit\n#@@ exit 1\n# END\n\n# BEGIN: job: move into the foreground\n#@@ fg\n#@@ fg %1\n# END\n\n# BEGIN: formatted printing\n# Native support.\nprintf \"%05d %s\\n\" 42 \"Deep Thought\"\n# END\n\n# BEGIN: if\/then\/else: numeric\ni=2\nif (( i&gt;2 )) ; then\n    echo i greater than 2\nelif (( i&lt;2 )) ; then\n    echo i less than 2\nelse\n    echo i is two\nfi\n# END\n\n# BEGIN: if\/then\/else: string\ns=\"foo bar\"\nif [[ \"$s\" == \"foo bar\" ]] ; then\n    echo \"foo\"\nelse\n    echo \"spam\"\nfi\n# END\n\n# BEGIN: include a file\n#@@ source include-file\n#@@ .  include-file\n# END\n\n# BEGIN: set resource limits\n#@@ ulimit\n# END\n\n# BEGIN: set path variable\nexport PATH=\"$PATH:\/tmp\"\n# END\n\n# BEGIN: get shell name\necho $SHELL\n# END\n\n# BEGIN: get shell version\nbash --version\necho $BASH_VERSION\n# END\n\n# BEGIN: switch statement\narg=\"foo\"\ncase \"$arg\" in\n    \"foo\")\n        echo \"do foo\"\n        ;;\n    \"bar\")\n        echo \"do bar\"\n        ;;\n    \"spam\")\n        echo \"do spam\"\n        ;;\n    *)\n        echo \"do be do be do\"\n        ;;\nesac\n# END\n\n# BEGIN: read values from the console\nread -p \"login? \" login\nread -p \"passwd? \" -s passwd\necho\necho \"login: $login\"\necho \"passwd: $passwd\"\n# END\n\n\n# BEGIN: prompt\nset PS1='\\u &gt;'  # user name\nset PS1='\\h &gt;'  # host\nset PS1='\\! &gt;'  # command num\n#set PS1=N\/A &gt;' # last 3 dir parts\nset PS1='\\W &gt;'  # last dir part\nset PS1='\\w &gt;'  # curr dir full\nset PS1='\\v &gt;'  # shell version\nset PS1='\\u@\\h \\W (\\!) &gt;'\n# END\n\n# BEGIN: regex extension check\nFILES=('f1.tar.bz2' 'f2.tar.gz' 'f3.zip')\nfor FILE in ${FILES[@]} ; do\n    if [[ \"$FILE\" =~ .tar.bz2$ ]] ; then\n        echo \"tar.bz2: $FILE\"\n    elif [[ \"$FILE\" =~ .tar.gz$ ]] ; then\n        echo \"tar.gz: $FILE\"\n    elif [[ \"$FILE\" =~ .zip$ ]] ; then\n        echo \"zip: $FILE\"\n    else\n        echo \"unk: $FILE\"\n    fi\ndone\n# END\n\n# BEGIN: command substitution\n# style 1 - can't be nested\nx=`ls -1`\n# style 2 - can be nested\nme=$(dirname -- $(readlink -f .))\necho $me\n# END\n\n# BEGIN: local variable\nfunction fct {\n    local var='local'\n}\n# END\n\n# BEGIN: range iteration\nfor i in `seq 1000` ; do\n    echo $i\ndone\n\nfor i in $( seq 1000 ) ; do\n    echo $i\ndone\n\n# fastest\nfor i in {1..1000} ; do\n    echo $i\ndone\n# END\n\n# BEGIN: setenv\/export\nexport FOOBAR=\"spam\"\n# END\n\n# BEGIN: variable: substitution\nfoo='bar'\necho ${foo\/bar\/baz\/}\n# END<\/code><\/pre>\n\n\n<a name=\"tcsh\"><\/a>\n<h2>Tcsh Commands Script (compare.csh)<\/h2>\n<p>\nThis is the script that tested the tcsh commands.\n<\/p>\n\n<pre class=\"wp-block-code language-tcsh\"><code class=\"language-tcsh\">#!\/bin\/tcsh\n\n# BEGIN: alias\nalias foo bar\n# END\n\n# BEGIN: array: declaration\nset ARRAY = (\"a\" \"b\" \"c\")\n# END\n\n# BEGIN: array: size\necho $#ARRAY items\n# END\n\n# BEGIN: array: first item\necho \"first item [1] = $ARRAY[1]\"\n# END\n\n# BEGIN: array: iterate by item\nforeach item ( $ARRAY )\n    echo item = $item\nend\n# END\n\n# BEGIN: array: iterate by item, single line\n#@@ N\/A\n# END\n\n# BEGIN: array: iterate by index\nforeach i ( `seq $#ARRAY` )\n    echo $i $ARRAY[$i] |\\\n        awk '{printf(\"%d %s\\n\",$1,$2);}'\nend\n# END\n\n# BEGIN: variable: create scalar\nset i=0\nset=\"foo bar spam\"\n# END\n\n# BEGIN: variable: create array\nset ARRAY=(\"item1\" \"item2\" \"item2\")\n# END\n\n# BEGIN: variable: destroy or unset\nset ARRAY=(\"item1\" \"item2\" \"item2\")\nunset ARRAY\n# END\n\n# BEGIN: variable: auto increment\nset i=0\n@ i++\necho auto increment = $i\n# END\n\n# BEGIN: variable: auto decrement\nset i=0\n@ i--\necho auto decrement = $i\n# END\n\n# BEGIN: function\n#@@ N\/A\n#@@ Can be emulated using \n#@@ external scripts\n# END\n\n# BEGIN: job: start in the background\n#@@ job &amp;\n# END\n\n# BEGIN: job: move into the background\n#@@ job\n#@@ &lt;Ctrl-Z&gt;\n#@@ bg\n# END\n\n# BEGIN: job: move into the foreground\n#@@ fg\n#@@ fg %1\n# END\n\n\n# BEGIN: job: status\n#@@ job\n#@@ echo status = $?\n# END\n\n# BEGIN: variable: debug tracing\nset verbose # on\npwd\nunset verbose # off\npwd\n# END\n\n# BEGIN: variable: dump state\nset\n# END\n\n# BEGIN: variable: turn on unset variable checking\n#@@ N\/A\n# END\n\n# BEGIN: variable: automatically exit on error\n#@@ \/bin\/tcsh -e # invocation only\n# END\n\n# BEGIN: variable: print environment variables\nenv\nprintenv\n# END\n\n# BEGIN: variable: dynamic\n# Not native, need to use eval.\nset a=\"some value\"\nset b=\"a\"\neval \"echo $b = \"'$'${b}\nset bv=`eval echo '$'$b`\necho bv = $bv\n# END\n\n# BEGIN: IO: redirect stdout\nls &gt; \/tmp\/$$\n# END\n\n# BEGIN: IO: redirect stderr\n( ls &gt; \/dev\/tty ) &gt;&amp; \/tmp\/$$\n# END\n\n# BEGIN: IO: redirect stdout and stderr\nls &gt;&amp; \/tmp\/$$\n# END\n\n# BEGIN: exit the shell\n#@@ exit\n#@@ exit 1\n# END\n\n# BEGIN: formatted printing\n# No native support, \n# emulate with awk. \n# Embedded spaces are a pain.\necho 42 \"Deep Thought\" |\\\n  awk '{printf(\"%05d %s %s\\n\",$1,$2,$3);'}\n# END\n\n# BEGIN: if\/then\/else: numeric\nset i=2\nif ($i&gt;2) then\n    echo i greater than 2\nelse if ($i&lt;2) then\n    echo i less than 2\nelse\n    echo i is two\nendif\n# END\n\n# BEGIN: if\/then\/else: string\nset s=\"foo bar\"\nif (\"$s\" == \"foo bar\") then\n    echo \"foo\"\nelse\n    echo \"spam\"\nendif\n# END\n\n# BEGIN: include a file\n#@@ source include-file\n# END\n\n# BEGIN: set resource limits\n#@@ limit\n# END\n\n# BEGIN: set path variable\nset path = ( $path \/tmp )\n# END\n\n# BEGIN: get shell name\necho $shell\n# END\n\n# BEGIN: get shell version\ntcsh --version\necho $version\n# END\n\n# BEGIN: switch statement\nset arg=\"foo\"\nswitch (\"$arg\")\n    case \"foo\":\n        echo \"do foo\"\n        breaksw\n    case \"bar\":\n        echo \"do bar\"\n        breaksw\n    case \"spam\":\n        echo \"do spam\"\n        breaksw\n    default:\n        echo \"do be do be do\"\n        breaksw\nendsw\n# END\n\n# BEGIN: read values from the console\necho -n \"login? \"\nset login = $&lt;\n\necho -n \"passwd? \"\nstty -echo\nset passwd = $&lt;\nstty echo\n\necho\necho \"login: $login\"\necho \"passwd: $passwd\"\n# END\n\n# BEGIN: prompt\nset prompt='%n &gt;'  # user name\nset prompt='%j &gt;'  # host\nset prompt='! &gt;'   # command num\nset prompt='%c3 &gt;' # last 3 dir parts\nset prompt='%c &gt;'  # last dir part\nset prompt='%~ &gt;'  # curr dir full\n#set prompt=N\/A    # shell version\nset prompt='%n@%j %c (!) &gt;'\n# END\n\n# BEGIN: regex extension check\nset FILES=('f1.tar.bz2' 'f2.tar.gz' 'f3.zip')\nforeach FILE ( $FILES )\n    echo $FILE | grep '.tar.bz2$' &gt;&amp;\/dev\/null\n    if ( $? == 0 ) then\n        echo \"tar.bz2: $FILE\"\n        continue\n    endif\n\n    echo $FILE | grep '.tar.gz$' &gt;&amp;\/dev\/null\n    if ( $? == 0 ) then\n        echo \"tar.gz: $FILE\"\n        continue\n    endif\n\n    echo $FILE | grep '.zip$' &gt;&amp;\/dev\/null\n    if ( $? == 0 ) then\n        echo \"zip: $FILE\"\n        continue\n    endif\n\n    echo \"unk: $FILE\"\nend\n# END\n\n# BEGIN: command substitution\n# style 1 - can't be nested\nset x = `ls -1`\n# style 2 - not supported\nset r = `readlink -f .`\nset me = `dirname $r`\necho $me\n# END\n\n# BEGIN: local variable\n# functions not supported\n# END\n\n# BEGIN: range iteration\nforeach i ( `seq 1000` )\n  echo $i\nend\n# END\n\n# BEGIN: setenv\/export\nsetenv FOOBAR \"spam\"\n# END\n\n# BEGIN: variable: substitution\nset foo = 'bar'\necho $foo:s\/bar\/baz\/\n# END<\/code><\/pre>\n\n\n\n","protected":false},"excerpt":{"rendered":"<p>Table of Contents Bash\/Tcsh Comparison Table How It Was Generated Makefile Generate HTML (genhtml.py) Bash Commands Script (compare.sh) Tcsh Commands Script (compare.csh) Bash\/Tcsh Comparison Table The table below shows bash commands and their equivalents in tcsh along with the tools that I wrote to create it. I put it together because I sometimes have to &hellip; <a href=\"https:\/\/joelinoff.com\/blog\/?page_id=235\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Translate between bash and tcsh commands<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"open","ping_status":"open","template":"","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"class_list":["post-235","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/joelinoff.com\/blog\/index.php?rest_route=\/wp\/v2\/pages\/235","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/joelinoff.com\/blog\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/joelinoff.com\/blog\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/joelinoff.com\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/joelinoff.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=235"}],"version-history":[{"count":85,"href":"https:\/\/joelinoff.com\/blog\/index.php?rest_route=\/wp\/v2\/pages\/235\/revisions"}],"predecessor-version":[{"id":1803,"href":"https:\/\/joelinoff.com\/blog\/index.php?rest_route=\/wp\/v2\/pages\/235\/revisions\/1803"}],"wp:attachment":[{"href":"https:\/\/joelinoff.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=235"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}