2
[ -f /tmp/myfile.txt ] && echo "File exists" || echo "No such file"

これはどのように作動しますか?具体的には と の評価&&です||

4

2 に答える 2

5

&&||前のコマンドの終了ステータスに基づいて、次のコマンドを実行するかどうかを決定する制御演算子です。から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これは、これらの制御演算子とコマンドの微妙ではあるが重要な違いです。

于 2013-01-23T16:09:43.260 に答える
0

基本的な考え方は、左から右に実行することです

最初に -f /tmp/myfile.txt を評価します。これは、ファイルが存在し、ファイルである場合に true になります。

次に、左右の引数を取る && を評価しようとします。論理的な「and」です。

左から右に遅延評価を行うため、ファイル テストが true の場合は、echo コマンドを実行して true をチェックします。おそらく、シェルの世界で「true」とは、ゼロの終了コードで正常に実行されることを意味します

ファイル テストまたはエコー ( && の 2 つの引数) のいずれかが false の場合、 && からの出力は false であり、これが右側に渡されます。

|| は論理「or」であり、左右の引数も持ちます。左の引数が真の場合、遅延しているためそこで停止します

左の引数が false (ファイルが存在しない) の場合、右の引数が実行されます。

于 2013-01-23T16:15:32.210 に答える