`-`で` -a`または `-o`演算子を使用しないでください


11

StéphaneChazelasが書いた:

いくつかのルール

  • 常に変数を引用する
  • -aor -o演算子を使用しないでください(いくつかの[コマンドと&&andおよび||shell演算子を使用します)

作る[POSIXシェルで信頼性の高いです。

なぜ「-aまたは-o演算子を使用しない」のですか?

「いくつかの[コマンドと&&andおよび||shell演算子を使用する」にはどうすればよいですか?

回答:


13

なぜ「-aまたは-o演算子を使用しない」のですか?

あいまいで、POSIXに準拠していない可能性があるためです

-aおよび-oバイナリプライマリと '('および ')'演算子を指定するXSI拡張機能は廃止予定としてマークされています。(それらを使用する多くの式は、評価される特定の式によっては、文法によってあいまいに定義されます。)これらの式を使用するスクリプトは、以下に示す形式に変換する必要があります。多くの実装はこれらの陳腐化した形式をサポートし続けますが、これらおよび他のプライマリーと演算子と混同される可能性があるユーザー提供の入力を処理する場合、スクリプトは非常に注意する必要があります。アプリケーション開発者がスクリプトへの入力を生成するすべてのケースを知らない限り、呼び出しは次のようになります。

test "$1" -a "$2"

次のように記述する必要があります:

test "$1" && test "$2"

「いくつかの[コマンドと&&andおよび||shell演算子を使用する」にはどうすればよいですか?

複数のテストを実行し、前述の演算子を使用してそれらをチェーンすることによって。例えば:

[ 0 -eq 0 -a \( 0 -eq 1 -o 1 -eq 1 \) ]

同等のものとして書き直すことができます:

[ 0 -eq 0 ] && ([ 0 -eq 1 ] || [ 1 -eq 1 ])

または、より良い:

[ 0 -eq 0 ] && { [ 0 -eq 1 ] || [ 1 -eq 1 ]; }

ありがとう。(1)「 '('および ')'演算子は廃止予定とマークされています。」ある()事業者は、グループコマンドということ?それらが時代遅れである場合、それらの代わりは何ですか?(2)はすべきtest "$1" -a "$2"で置き換えることtest "$1" && test "$2"によって、または((test "$1" && test "$2"))?必要ありません((..))か?
Tim

@Tim更新を参照してください。(1)はい-あなたが使用することができます()し、{}代替として。(2)最初のもの; (())は、算術展開に使用されます。ここでは、一連のテストの終了ステータスをテストするため、サブシェル()または現在のシェルでテストをグループ化します{}
コス2016年

ありがとう。私の質問はこの投稿を超える可能性があると思います。だから私はそれらを新しい投稿に投稿します。
Tim

1
@Tim (and )演算子を使用する唯一の理由は、-aまたはを使用している場合-oです。後者は陳腐化しているため、前者も明らかに不要になっています。
Barmar 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.