ShellScriptの特殊変数と比較

今回、oh-my-zshのテーマのカスタマイズで学んだシェルスクリプトについて書きます。
 
 ・特殊変数
 ・変数の比較(数値比較、文字列比較)  

特殊変数

$$・・・・・・現在のプロセス番号(PID)
$?・・・・・・直近のコマンドの実行結果のステータスコード
$#・・・・・・シェルスクリプト実行時の引数の数
$@,$*・・・シェルスクリプト実行時の全引数の変数


$?の種類について

0・・・・コマンド正常終了
1・・・・コマンド以上終了
2・・・・シェルスクリプトの異常終了(文法エラー、文字列の比較など)
126・・・権限のないファイルを実行する
127・・・シェルスクリプト内での"command not found"
130・・・Ctl-Cを使用した場合のスクリプトの強制停止

status code is 2
構文でのエラー
#!/bin/bash
for a in 1 2 3
do
  echo "test"
数値と文字列の計算でのエラー
#!/bin/bash
expr 12 + "test"

status code is 126
権限のないファイルを実行する


[root@oomatomo app]# chown root:root test.sh [root@oomatomo app]# chmod 700 test.sh [root@oomatomo app]# exit exit [tomo]$./test.sh zsh: 許可がありません: ./test.sh [tomo]$ echo $? 126 [tomo]$ ls -la test.sh -rwx------ 1 root root 44 10月 8 22:38 2013 test.sh

こんな感じですね。これらを利用するとより便利なシェルスクリプトが使えそうですね。

変数の比較(数値比較、文字列比較)

シェルスクリプトでの比較の方法はいくつか存在することが分かりました。

数値の比較
$ if COUNT=$( echo 1 )   && [ $COUNT = 1 ] ;then echo true; else echo false; fi
true
$ if COUNT=$( echo "1" ) && [ $COUNT = 1 ] ;then echo true; else echo false; fi
true
$ if COUNT=$( echo "" )  && [ $COUNT = 1 ] ;then echo true; else echo false; fi
zsh: parse error: condition expected: =
false
$ if COUNT=$( echo "" )  && [ "$COUNT" = 1 ] ;then echo true; else echo false; fi
false
$ if COUNT=$( echo "1" ) && [ $COUNT = "1" ] ;then echo true; else echo false; fi
true
$if COUNT=$( echo "1" )  && [ "$COUNT" = "1" ] ;then echo true; else echo false; fi
true

文字列の比較 
$ if COUNT=$( echo "hoge") && [ $COUNT = "hoge" ] ;then echo true; else echo false; fi
true
$ if COUNT=$( echo "hoge") && [ "$COUNT" = "hoge" ] ;then echo true; else echo false; fi
true
$ if COUNT=$( echo "") && [ $COUNT = "hoge" ] ;then echo true; else echo false; fi
zsh: parse error: condition expected: =
false
$ if COUNT=$( echo "hoge") && [ x$COUNT = "hoge" ] ;then echo true; else echo false; fi
false
$ if COUNT=$( echo "hoge") && [ x$COUNT = x"hoge" ] ;then echo true; else echo false; fi
true
$ if COUNT=$( echo "hoge") && [ $COUNT = x"hoge" ] ;then echo true; else echo false; fi
false
$ if COUNT=$( echo "hoge") && [ x$COUNT = "hoge" ] ;then echo true; else echo false; fi
false
$ if COUNT=$( echo "") && [ x$COUNT = x"hoge" ] ;then echo true; else echo false; fi
false
$ if COUNT=$( echo "") && [ "$COUNT" = "hoge" ] ;then echo true; else echo false; fi
false
文字列は x$変数名 もしくは x"hoge" で文字列扱いになるそうです。

結論
数値の比較も文字列の比較も空の値の場合に対応して ”” で囲ったほうが良いという結論です。