なんとなく使っているけど、よくわかっていないこと, [ ] / test / [[ ]] の違い
1.前提
[ 外部コマンド・・・実体は、/usr/bin/[
test 外部コマンド・・・実体は、/usr/bin/test
[[ bashの内部コマンド
結論から言えば、条件式は
[[ ]] を使って、 == != < > <= >= とする
[ ] は、文字列を対象に、== != か、
整数を対象に -eq -ne,,, だけ使うということだ。
2.[ (test) と [[ の違い
[ test [[ ]]
文字列 = ○ ●
文字列 != ○ ●
文字列 < ▲ ●
文字列 > ▲ ●
整数 −eq ○ △
整数 −ne ○ △
整数 −lt ○ △
整数 −gt ○ △
[ test のハマリポイント
▲ [ “a” > “b” ] とすると、[ コマンドを引数”a”で動かして、
その、リダイレクト出力が“b”になる。
その結果、ファイル b が作成される。
▲ [ “a” < “b” ] とすると、[ コマンドを引数”a”で動かして、
その、リダイレクト入力が“b”になる。
ファイル b があれば、なんか動いてしまう。
ファイル b がなければ、ファイルbがないとエラーになる。
△ [[ -eq -ne -lt -get ]]は、整数に対してだけ正しく
文字列を評価した場合は、想定外動作をする(エラーMSGもない)
文字列1 −eq 文字列2 ・・・ 無条件にTRUE
文字列1 −以外 文字列2 ・・・ 無条件にFALSE
● [[ = == != < > ]]は、文字列・整数のいずれにも想定動作する
3.検証結果
[ test #文字列
$ [ "a" = "a" ] && echo "ok"
ok
$ [ "a" != "a" ] && echo "ok"
$ [ "a" = "b" ] && echo "ok"
$ [ "a" != "b" ] && echo "ok"
ok
$ [ "a" < "b" ] && echo "ok"
-bash: b: そのようなファイルやディレクトリはありません
[ test #整数
$ [ 1 = 1 ] && echo "ok"
ok
$ [ 1 != 1 ] && echo "ok"
$ [ 0 -lt 1 ] && echo "ok"
ok
$ [ 0 < 1 ] && echo "ok"
-bash: 1: そのようなファイルやディレクトリはありません
[[ ]] #文字列
$ [[ "a" = "a" ]] && echo "ok"
ok
$ [[ "a" != "a" ]] && echo "ok"
$ [[ "a" != "b" ]] && echo "ok"
ok
$ [[ "a" == "a" ]] && echo "ok"
ok
$ [[ "a" < "a" ]] && echo "ok"
$ [[ "a" < "b" ]] && echo "ok"
ok