`if $ cmd;正確にはどうですか?では、 $cmd fi` は `$cmd && $cmd` と違いますか?

`if $ cmd;正確にはどうですか?では、 $cmd fi` は `$cmd && $cmd` と違いますか?

他人に返信とても良い質問私は次のように主張します。

POSIX仕様を読んでみると、どちらかを使用する構文解析の観点と違いはありません。

POSIX 指定&&||リストは次のとおりです。複合コマンドこれは、設定された単純なコマンドを実行する前にリスト全体を読み、解析する必要があることを意味します。 POSIXはまたコマンドを指定します拡張は許可されていません||OR終了ステータスがゼロの別のコマンドに従う場合。予約語の後に続くコマンドが&&||別のコマンドに簡単にグループ化できると思われる場合、{ command || ( command ; list) ; }またはリストの各ブランチを&&||独自に作成してください。複合コマンド

ただし、POSIXはまた、if...;then...;else...fi構成の各ブランチに固有の属性があることを指定します。複合コマンドだから:

if compound-list
then
    compound-list
[elif compound-list
then
    compound-list] ...
[else
    compound-list]
fi

これif 化合物一覧exit状態が0の場合は実行する必要があります。then 化合物一覧実行され、コマンドが完了します。

then...else...orの後の​​文字列と予約語の後の文字列をにするのがこの仕様である。複合コマンドそれ自体だけでなく簡単なコマンドこれは、シェルのパーサーが正しく機能するためにコマンドと区切り文字を表す必要があることを意味します。

したがって、基本的にthen ' '同じ理由で動作しません。

function()
sh: line 2: syntax error: unexpected end of file 

...いいえ - それは言うことはできません。

わかりました...

[ -e doesntexist ] && $((i=1)) ; echo $i

\n...私の答えで指摘された仕様のため、すべての副作用が短絡され、1つのewlineのみが生成されます。結果は...

if [ -e doesntexist ] 
    then $((i=1))
fi
echo $i

… …それは同じです。

ところが正直に私がif...fi使用をほとんどしなかったので何か間違って読んだのかよく分からないので説明が間違っているというコメントが走ったり、追加的に気になる点があればただ聞いてみたりします。回答を削除し、次の質問に置き換えました。私はどのように間違っていますか?どう違いますか?

ベストアンサー1

単純な場合のみ sum で&&表現できます||。このif構造はより一般的です。 (必要に応じてブロックを区切るために中かっこを正しく使用すると仮定します)if CONDITION; then FOO; fi同じですが、一度(または)が発生すると、通常は不可能です。CONDITION && FOOelseelif

if CONDITION; then FOO; else BAR; fi

等しくない

CONDITION && FOO || BAR

trueの場合、CONDITION両方の構成が実行されますFOOFOOfalseの場合、if生成はスキップされ、BAR生成&& … ||が実行されますBAR

いいえ、この問題を解決するためにこれを使用することはできませんCONDITION && { FOO; true; } || BAR。これにより、複合コマンドがこの場合、trueの場合はtrueを返し、CONDITIONfalseを返します。FOOif CONDITION; then FOO; else BAR; fi

これは意味の違いです。また、読みやすさもあります。&&ネストされた使用により、||迅速に復号化が困難になります。実際、同じコマンドでこれら2つの演算子を使用することはお勧めできません。特に、両方の演算子はシェルで同じ優先順位を持っていますが、CとPerlとRubyを含む他のほとんどのC言語では優先順位が異なることを考えるとさらにそうです。

おすすめ記事