シェルスクリプトは原始的だから、様々な引っ掛けがある

a=1
${a}

変数の定義では、$ を付けないけど、参照時には、$ を付けるとか。
型が無いから、1 を代入しても文字列になる

a = 1
と、半角空白を入れると、ダメだし

if [ $a = 1 ]
if [$a = 1 ]

if文でも、[ の次に、半角空白が無いと、ダメ。
[ がコマンド名で、$a = 1 ] が空白で区切られた引数

シェルスクリプト・PowerShell は簡単なものを作る時だけに使う。
複雑なプログラミングは、Ruby で作る