bash if文の動作に関する問題

bash if文の動作に関する問題

私は次のbashスクリプトを書いた。

if [ $(tmux has -t junk) ]
then
echo zero
else
echo one
fi

セッションの有無にかかわらず常に1を返します。 tmuxステートメントを実行し、次に$?を実行してコマンドラインを確認しました。 。期待どおりに動作します。セッションが存在する場合は0、セッションが存在しない場合は1 if文が異なる動作をしないのはなぜですか? if文を次のように変更してみました。

tmux has -t junk
if [ $? -eq 0 ]
then
echo zero
else
echo one
fi

上記はうまくいきます。それでは、最初のステートメントブロックにはどのような問題がありますか?

答え1

前述のように、if [ $(tmux has -t junk) ]拡張値if [ ]はfalseです。

あなたが使用できる:

if tmux has -t junk; then
    echo OK
else
    echo ERR
fi

またはより短い内容が欲しい場合:

tmux has -t junk || echo ERR

または

tmux has -t junk && echo OK || echo ERR

さらに適切な場合は、次のように否定することもできます。

! tmux has -t junk || echo OK
! tmux has -t junk && echo ERR || echo OK
etc.

編集する:

また、コマンドが出力を生成する場合は、次のようにその出力をブラックホールにリダイレクトできます/dev/null

 if my_cmd >/dev/null; then echo OK else; echo ERR; fi

コマンドがテキストエラーを生成する場合は、次のように標準エラーをリダイレクトすることもできます。

 if my_cmd >/dev/null 2>&1; then echo OK else; echo ERR; fi

次の内容はおそらくすでに知っていますが、完全性のために追加されました。

前述のように:$?プログラムの戻り値を取得する唯一の方法です。

一部のプログラムの戻り値は異なり、かなり明確な意味を持つことができます。

たとえば、次のようになります。

mycmd
ecode=$?

case "$ecode" in
0) echo "Success";;
1) echo "Operation not permitted";;
2) echo "No such file or directory";;
esac

これにより、特定のエラーに対して適切な処置を取ることができます。

MySQLがインストールされている場合は、次のことができます。間違い:

for i in {0..50}; do perror $i; done
# And
for i in {1000..1050}; do perror $i; done

来て体験してください。

また、見ることができますこの回答オペレーティングシステム固有のエラーに関連し、Open Groupsのマニュアルにもリンクされています。エラー番号そしてエラー番号

それとも見てくださいSQLiteそしてその広がる

答え2

あなたが使用するとき:

if [ $(tmux has -t junk) ]

これはコマンドの出力を確認しますtmux has -t junkが、戻り値は確認しません。

したがって、常に最初のケースのようなものを印刷するので、これはtmux has -t junkコマンドが標準出力に何も印刷しないことを意味します。

だから最初のケースでは、

if [ $(tmux has -t junk) ] 

と評価された

if [ ]

関連情報