私は時々シェルスクリプトを書くのですが、よく構文などを忘れて何度も調べることになるので、ここにまとめておきます。
1. 基本文法編
1.1 条件式について
シェルスクリプトでは文字列型と数値型の区別が存在しない(全て文字列型である)ために条件式は
・文字列型として扱う条件式
・数値型として扱う条件式
があり、例えば "1"と1はどちらの条件式に入力しても同じ振る舞いをします。
#文字列型の条件式
[ -z 変数 ] #変数の長さが0の時(何も入力されていない時)
[ -n 変数 ] #変数の長さが0出ない時
[ 変数1 = 変数2 ] #変数1と変数2の文字列が等しい時(str1 == str2)
[ 変数1 != 変数2 ] #変数1と変数2の文字列が等しくない時(str1 != str2)
#数値型の条件式
[ 変数1 -eq 変数2 ] #(int1 == int2)
[ 変数1 -ne 変数2 ] #(int1 != int2)
[ 変数1 -lt 変数2 ] #(int1 < int2) int1 "Littler Than" int2
[ 変数1 -le 変数2 ] #(int1 <= int2) int1 "Littler than or Equal" int2
[ 変数1 -gt 変数2 ] #(int1 > int2) int1 "Grater Than" int2
[ 変数1 -ge 変数2 ] #(int1 >= int2) int1 "Grater than or Equal" int2
1.2 if文
if ["条件式"];then
処理1
elif ["条件式"];then
処理2
else
処理3
fi
1.3 while文
while ["条件式"]
do
処理
done
1.4 for文
for "仮変数" in "配列"
do
処理
done
1.5 数値計算
シェルでは基本文字列型なので数値計算をする際は別に数値として計算するための処置が必要です
1.5.1 リテラルの計算
パターン1:$(())を使う場合
$ echo $((1+1))
=> 2
$ echo $((1 + 1))
=> 2
$ echo $(( 1 + 1 ))
=> 2
$(())を使う場合は空白をどのようにおいても計算できます。
#######################################
パターン2:exprを使う場合
$ echo `expr 1 + 1`
=> 2
$ echo `expr 1+1`
=> 1+1
exprを使う場合は数値と記号の間に空白を入れる必要があります
1.5.2 変数の計算
$ var=1
パターン1:$(())を使う場合
$ echo $((${var}+1))
=> 2
$ echo $((var+1))
=> 2
カッコ内で変数を評価するようなので変数に$がなくても計算されるようです
############################################
パターン2:exprを使う場合
$ echo `expr $var + 1`
=> 2
$ echo `expr var + 1`
=> expr: not a decimal number: 'fuga'
変数に$がないとエラーが発生します
############################################
パターン3:letを使う場合
$ let $var=$var+1 && echo $var
=> 2
$ let var=var+1 && echo $var
=> 2
letは変数への入力を行うので、計算結果は出力はされないことに注意しておく必要があります
############################################
パターン4:declareを使う場合
$ declare -i x
$ x=1+1
$ echo $x
=> 2
$ x=1 + 1
=> bash: +: command not found
$ x="1 + 1"
$ echo $x
=> 2
declare -i は整数として定義するコマンドで、定義した変数に対する代入処理に対して計算処理を行うようです