私は次の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のマニュアルにもリンクされています。エラー番号そしてエラー番号。
答え2
あなたが使用するとき:
if [ $(tmux has -t junk) ]
これはコマンドの出力を確認しますtmux has -t junk
が、戻り値は確認しません。
したがって、常に最初のケースのようなものを印刷するので、これはtmux has -t junk
コマンドが標準出力に何も印刷しないことを意味します。
だから最初のケースでは、
if [ $(tmux has -t junk) ]
と評価された
if [ ]