Bashのif文の書き方: [とtestの違い
目次
- Bashのif文の書き方
- if文の構造
- testコマンドの使い方
- testの代わりに
[
を使う - 結果を反転する
- elif
- else
- if文とtrueとfalse
- if文と変数
- AND
- OR
- 使用例
- ファイルは存在する?
- 問題
Bashのif文の書き方
Bashではif
文を使うことができます。
これは特定の条件の時に処理を分岐させたいときに使われる文です。
Bashのif
文は↓のように使います。
i=1 if [ $i == 0 ]; then echo "zero" elif [ $i == 1 ] && [ $i -lt 2 ]; then echo "one" else echo "other" fi
実行結果。
one
if文の構造
Bashのif
文は↓のような構造になっています。
「判定」部分のコマンドの結果が0
ならthen~fi
内の「処理」を実行し、0
以外なら処理を実行しません。
if 判定; then 処理 fi
また、セミコロンを付けない場合は↓のように書くことが出来ます。
if 判定 then 処理 fi
「判定」部分にはtest
コマンドを渡します。
# 1が1ならtrue if test 1 -eq 1; then echo "true" fi
実行結果。
true
testコマンドの使い方
test
はファイルまたは値を比較し、オプションの条件にマッチすれば0
を、マッチしなければ0
以外を終了値として返すコマンドです。
たとえば2つの値が等しいかチェックしたい時は-eq
オプションを使います。
# 1と1は等しい(eq)? test 1 -eq 1 echo $? # 0 # 0と1は等しい(eq)? test 0 -eq 1 echo $? # 1
ほかにも↓のようなオプションがあります。
# 1と0は等しくない? test 1 -ne 0 echo $? # 0 # 2は1以上? test 2 -ge 1 echo $? # 0 # 2は1より上? test 2 -gt 1 echo $? # 0 # 1は2以下? test 1 -le 2 echo $? # 0 # 1は2より下? test 1 -lt 2 echo $? # 0
特に文字列の比較では==
と!=
を使います。
test "abc" == "abc" echo $? # 0 test "abc" != "def" echo $? # 0
test
には他にも様々なオプションがあります。
詳しくはman test
でマニュアルを参照してください。
testの代わりに[
を使う
test
と同じような振る舞いをするコマンドに[
があります。
このコマンドは末尾の]
を無視します。
よって[
を使うとif
文を↓のように書けます。
if [ 1 -eq 1 ]; then echo "true" fi
実行結果。
true
[
はtest
のエイリアスのように見えますが、別のコマンドです。Ubuntuなどでは/usr/bin/[
にバイナリが置かれています。
結果を反転する
test
の結果を反転するには!
を使います。
test ! 1 -eq 1 echo $?
実行結果。
1
if
文と[
を使う場合は↓のように書くことが出来ます。
if [ ! 1 -eq 0 ]; then echo "!!!" fi
実行結果。
!!!
elif
if
文にはelif
を繋げることが出来ます。
これは「1つ前のif
文の結果が0
(真)でなかったら実行するif
文」と言えます。
if [ 0 -eq 1 ]; then echo "0 is 1" elif [ 1 -eq 1 ]; then echo "1 is 1" fi
実行結果。
1 is 1
elif
は1つのif
文に何個でも繋げることが出来ます。
if false; then echo "false 1" elif false; then echo "false 2" elif true; then echo "true" fi
実行結果。
true
else
if
文にはelse
を繋げることが出来ます。
else
は1つのif
文に1つまで付けることが出来ます。
else
は「if
文の結果がどれも0
(真)でなかったら実行する文」と言えます。
if false; then echo "false 1" elif false; then echo "false 2" else echo "else!" fi
実行結果。
else!
if文とtrueとfalse
true
とfalse
コマンドはそれぞれ終了値を0
, 1
で返すコマンドです。
true echo $? # 0 false echo $? # 1
これらのコマンドを使えばif
文にtrue
やfalse
を指定することが出来ます。
if true; then echo "true!" fi # true! if false; then echo "false!" else echo "else!" fi # else!
if文と変数
test
や[
コマンドには変数を渡すことも出来ます。
i=0 if [ $i -eq 0 ]; then echo $i fi
実行結果。
0
AND
2つのコマンドの結果からAND
の論理値を得たい場合は↓のように&&
で繋げます。
i=2 if [ $i -ge 1 ] && [ $i -le 3 ]; then echo "1 <= $i <= 3" fi
実行結果。
1 <= 2 <= 3
これは「変数iの値が1以上かつ3以下なら」というif
文になります。
OR
2つのコマンドの結果からOR
の論理値を得たい場合は↓のように||
で繋げます。
i=1 if [ $i -eq 0 ] || [ $i -eq 1 ]; then echo "0 or 1" fi
0 or 1
これは「変数iの値が0または1なら」というif
文になります。
使用例
if
文の使用例です。
偶数ならnyan, 奇数ならwan
for
文でカウント変数をカウントし、カウント変数が偶数ならnyan
, 奇数ならwan
を表示するサンプルです。
for ((i=0; i<4; i++)); do if [ $((i % 2)) -eq 0 ]; then echo "nyan" else echo "wan" fi done
実行結果。
nyan wan nyan wan
終了しますか? 続行しますか?
「終了しますか?(y/n)
」というプロンプトを表示し、y
が入力されたらループを終了するサンプルです。
while true; do echo "終了しますか?(y/n)" read line if [ $line == "y" ]; then echo "終了します" break elif [ $line == "n" ]; then echo "続行します" else echo "不正な入力です" fi done
実行結果。
終了しますか?(y/n) n 続行します 終了しますか?(y/n) a 不正な入力です 終了しますか?(y/n) y 終了します
ファイルは存在する?
ファイルの存在確認はtest
の-e
オプションを使います。
また、結果を反転させるには!
を使います。
fname1="a.sh" fname2="b.sh" if [ -e $fname1 ]; then echo $fname1は存在します fi if [ ! -e $fname2 ]; then echo $fname2は存在しません fi
実行結果。
a.shは存在します b.shは存在しません
問題
Q1: if
文に繋げられる文節を答えよ
try
elif
else
Q2: test
で文字列の比較に使えるオプションを答えよ
==
-eq
!=
Q3: test
の終了値がn
のときif
文は真と評価する。n
の値を答えよ
1
2
0
正解
Q1: 2, 3
Q2: 1, 3
Q3: 3