[ -f /tmp/myfile.txt ] && echo "File exists" || echo "No such file"
これはどのように作動しますか?具体的には と の評価&&
です||
。
&&
||
前のコマンドの終了ステータスに基づいて、次のコマンドを実行するかどうかを決定する制御演算子です。からman (1) bash
:
制御演算子 && および || はそれぞれ AND リストと OR リストを示します。AND リストの形式は次のとおりです。
command1 && command2
command2 は、command1 がゼロの終了ステータスを返す場合にのみ実行されます。
OR リストの形式は次のとおりです。
command1 || command2
command2 は、command1 がゼロ以外の終了ステータスを返した場合にのみ実行されます。AND および OR リストの戻りステータスは、リストで実行された最後のコマンドの終了ステータスです。
[
、またはは、コマンドがテストに合格した場合、ゼロの終了ステータスtest
を返します。から:help test
test: test [expr] EXPR の評価に応じて、0 (真) または 1 (偽) のステータスで終了します。
だからあなたがするとき
[ -f /tmp/myfile.txt ] && echo foo || echo bar
あなたが本当に言っているのは (これを注意深く読んでください)ファイルが存在する場合は、foo をエコーします。ファイルが存在しないか、echo foo
コマンドが失敗した場合は、バーをエコーします。
if…then
これは、これらの制御演算子とコマンドの微妙ではあるが重要な違いです。
基本的な考え方は、左から右に実行することです
最初に -f /tmp/myfile.txt を評価します。これは、ファイルが存在し、ファイルである場合に true になります。
次に、左右の引数を取る && を評価しようとします。論理的な「and」です。
左から右に遅延評価を行うため、ファイル テストが true の場合は、echo コマンドを実行して true をチェックします。おそらく、シェルの世界で「true」とは、ゼロの終了コードで正常に実行されることを意味します
ファイル テストまたはエコー ( && の 2 つの引数) のいずれかが false の場合、 && からの出力は false であり、これが右側に渡されます。
|| は論理「or」であり、左右の引数も持ちます。左の引数が真の場合、遅延しているためそこで停止します
左の引数が false (ファイルが存在しない) の場合、右の引数が実行されます。