
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
このスクリプトを実行すると、「first if Works」のみが印刷されます。これら2つのifステートメントは同じなので、うまくいきませんか?私は何を逃したことがありませんか?ところで、重要な場合はFreeBSDで実行されています。
答え1
この声明は同じではありません。
最初$?
空でない文字列を確認しています;常にそうするので、最初の体はif
永遠に走るでしょう。[
string
]
はい
文字列が真の場合ひも空の文字列ではありません。それ以外の場合は false です。
第二tput setaf 1
成功したか終了ステータスが(したがって$?
)ゼロであることを確認しています。。 2番目の関数の本文は、コマンドが成功した場合if
にのみ実行されます。tput
おおよそ次のようになります。
tput setaf 1
if [ $? -eq 0 ]
...
説明した結果は、tput setaf 1
ゼロ以外のコード(例:1)で終了することを示します。 " 1
"は空ではない文字列ですが、ゼロではありません。tput setaf 1 ; echo $?
実際のコードが何であるかを教えて、さらに調査することができます。