Bashスクリプトのifステートメントでtputコマンドを使用しようとしていますが、何らかの理由で予期しない動作をしています。コマンドを実行してからifステートメントでのみ終了コードをチェックすると正しく機能しますが、ifステートメントでコマンドを直接実行すると機能しなくなります。これが私の問題を説明するための簡単なスクリプトです:
#!/bin/bash
tput setaf 1
if [ $? ]
then
echo "first if works"
fi
if tput setaf 1
then
echo "second if works"
fi
このスクリプトを実行すると、「最初に機能する場合」のみが出力されます。これらのifステートメントは同等であるため、両方とも機能するべきではありませんか?私は何かが足りないのですか?ところで、これは重要な場合に備えてFreeBSDで実行されています。
これらのステートメントは同等ではありません。
最初の $?
が空でない文字列であるかどうかをチェックしています ;常にそうなるので、最初のif
の本体は常に実行されます。 [
string
]
は
文字列stringがnull文字列でない場合はTrue。それ以外の場合はfalse。
2番目の tput setaf 1
が成功したかどうか、またはその終了ステータス(したがって$?
)がゼロかどうかをチェックしています 。 2番目のif
の本体は、tput
コマンドが成功した場合にのみ実行されます。ほぼ同等です
tput setaf 1
if [ $? -eq 0 ]
...
説明している結果は、tput setaf 1
がゼロ以外のコード(たとえば、1)で終了していることを示しています。 「1
」は空ではない文字列ですが、ゼロではありません。 tput setaf 1 ; echo $?
は、実際のコードが何であるかを示し、さらに調査することができます。