Buy this Shell Scripting Tutorial as PDF for only $5
Test is used by virtually every shell script written. test
が直接呼ばれることはあまりないので、そう見えないかもしれません。 test
はシステム上では
if SPACE
Test is a simple but powerful comparison utility. For full details, run man test
と呼ばれることが多いのですが、ここではいくつかの使い方と典型的な例を紹介します。
Test は if
と while
を使って間接的に呼び出されることがほとんどです。 test
という名前のプログラムを作って実行しようとすると、プログラムではなくこのシェル組み込み関数が呼び出されるからです!if...then...else...
の構文は次のとおりです:
if then # if-codeelse # else-codefi
if ; then # do somethingfi
また、次のように elif
を使うこともできます:
if ; then echo "Something" elif ; then echo "Something else" else echo "None of the above"fi
次のコード片を試してみてください。実行前に変数 X にさまざまな値 (-1, 0, 1, hello, bye, など) を設定してみてください。
$ X=5$ export X$ ./test.sh ... output of test.sh ...$ X=hello$ ./test.sh ... output of test.sh ...$ X=test.sh$ ./test.sh ... output of test.sh ...
次に、$X
を既存のファイル名として、/etc/hosts
.
test.sh
2行をつなぐためにセミコロン (;
) を使用できることに注意してください。 これは単純な if
文でスペースを節約するためによく使われる。
バックスラッシュ (\
) も似たような、しかし反対の目的を果たしている。 これは読みやすくするために有効である。 バックスラッシュ (\
) やセミコロン (;
) の後に次の行をインデントするのが通例である。
例えば、セミコロン (;
) は if
と then
キーワードをつなぐためによく使われる。
if ; then echo "X is a file which is newer than /etc/passwd"fi
一方バックスラッシュ (\
) は、シェルスクリプトファイルで一行コマンドを二行に分けるために、読みやすさを考慮して使われている。
&& \ echo "X is a file which is newer than /etc/passwd"
これらの例からわかるように、test
は数値、文字列、ファイル名に対して多くのテストを実行することができる。
if
ステートメントをよりシンプルに書く方法がある。 &&
と ||
コマンドはそれぞれ結果が真か偽の場合に実行するコードを与える。
この構文は というファイル(またはシェルビルドイン)があるために可能で、読者を過度に混乱させたくない while ループやつまらないサニティチェックに推奨される。
Note that you set X to a non-numeric value, the first few comparisonsresult in the message:
これは -lt, -gt, -le and -ge 比較が整数に対してのみ設計されており、文字列に対しては機能しないためである。 !=
のような文字列比較は喜んで "5" を文字列として扱いますが、"Hello" を整数として扱う賢明な方法はありませんので、整数比較は文句を言います。
シェルスクリプトをより優雅に動作させたいのであれば、テストする前に変数の内容をチェックする必要があります(例えば次のようなものです)。
こうすることで、echo
より意味のあるメッセージをユーザーに伝え、優雅に終了することができます。 変数 $?
については、変数 - パート II で説明していますし、grep
は複雑なものなので、ここで説明します。 grep
は数字 (0-9) と他の文字を含む行を見つけるので、grep
のキャレット (^
) は数字だけでない行だけを見つける。 そして、その逆を取ることができます(成功ではなく、失敗で行動することによって)。 いいですか? >/dev/null 2>&1
は出力やエラーをユーザーの画面ではなく、特別な "null" デバイスに誘導する。
訂正してくれた Paul Schermerhorn に感謝する。このページは以前 grep -v
が動くと主張していたが、これは明らかに単純すぎる。
以下のように while ループで test を使用できます。
test2.sh
#!/bin/shX=0while do echo "Enter some text (RETURN to quit)" read X echo "You said: $X"done
このコードは、RETURN (X はゼロ長) を押すまで入力を求め続けます。Justin Heath がこのスクリプトが動作しないことを指摘してくれてありがとう - while
で $X の周りの引用符を外してしまったのです。 この引用符がないと、$Xが空のときにテストするものがないのです。
Alexander Weber は、このスクリプトを実行すると無残な結果になると指摘しています。
これは、ループ内の別のテストによって整理することができます。
if then echo "X is less than zero"fi.......... and ........if ; then echo "You said: $X"fi
if
ステートメントとthen
コンストラクトの間にブレークを入れる必要があります。 これはセミコロンでも改行でも構いませんが、if
とthen
の間にどちらか一方を入れなければなりません。 ループ 次 ケース