Bashスクリプトの場合は、ifステートメントでテスト式をいつ使用するかを混乱させます。
たとえば、次のように動作します。
if finger | grep -q alex
しかし、以下の場合はそうではありません。
if [ finger | grep -q alex ]
ただし、次のことができます。
if [ 3 -gt 5 ]
それでは、いつテスト式を使用し、いつ使用しないでください。また、上記のコマンドでテスト式を使用する方法はありますか?
ベストアンサー1
test
混乱の原因は、(AKA [
)が成功(0)または失敗(ゼロ以外)の結果を返す別のコマンドであることを知らないか、それが何であるかを完全に理解していないためです。スーダン。
if
常に次のように実行します。
if command; then
do something
fi
elif
オプションまたは句を含むelse
。
コマンドは、test
または、[
または他のもの(長くて複雑なコマンドパイプラインでも)にすることができ、すべてのプログラムは終了時に終了コードを返します。 @Kamil Maciorowskiがコメントで述べたように、重要なのは終了コードであり、終了コードのソースは重要ではありません。finger
grep
if
test
/は[
多くの最新のシェル(bashを含む)に組み込まれているコマンドですが、これは実際には変更されません。組み込みコマンドになる前に、/usr/bin/test
実際には/usr/bin/[
外部バージョンが今日test
でもまだ[
存在しています(GNU bashの組み込みコマンドとしても提供されていますが、GNU coreutilsに含まれています)。
$ ls -l /usr/bin/test /usr/bin/[
-rwxr-xr-x 1 root root 68496 Sep 21 01:27 /usr/bin/[
-rwxr-xr-x 1 root root 60304 Sep 21 01:27 /usr/bin/test
$ dlocate /usr/bin/test '/usr/bin/\['
coreutils: /usr/bin/[
coreutils: /usr/bin/test
ところで、help [
bashから:
[: [ arg... ]
Evaluate conditional expression.
This is a synonym for the "test" builtin, but the last argument must
be a literal `]', to match the opening `['.