`(`,`)`と`test`のPOSIX記述を理解する方法は?

`(`,`)`と`test`のPOSIX記述を理解する方法は?

~からPOSIX 2013:

-a および -o デフォルトのバイナリと「(」および「)」演算子を指定する XSI 拡張は、廃止とマークされています。 (これを使用する多くの式は、評価される特定の式に従って構文によってあいまいに定義されます。)これらの式を使用するスクリプトは、以下の形式に変換する必要があります。多くの実装はこれらの役に立たない形式をサポートし続けますが、スクリプトはユーザー提供の入力を処理するときに非常に注意する必要があります。これは、これらの基本と演算子と混同される可能性があるためです。アプリケーション開発者がスクリプトへの入力を生成するすべての状況を知らない限り、次のように呼び出します。

test "$1" -a "$2"

次のように書く必要があります。

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

  1. "'(' および ')' 演算子は廃止予定としてマークされました。"

    ()コマンドをグループ化してサブシェルを生成する演算子は何ですか?

    使用されなくなった場合の代替品とは何ですか?

  2. test "$1" -a "$2"に交換する必要がありますかtest "$1" && test "$2"、またはに交換する必要がありますか(( test "$1" && test "$2" ))

    ((...))元のコマンドのように0または1を返す必要はありませんか?test

ベストアンサー1

()コマンドをグループ化してサブシェルを生成する演算子は何ですか?

いいえ、ドキュメントでは、次を使用して式をグループ化する演算子を参照しますtest

test 0 -eq 0 -a \( 0 -eq 1 -o 1 -eq 1 \)

使用されなくなった場合の代替品とは何ですか?

代替コマンドはおよび(){}、これはシェルレベルで同様にコマンドをグループ化します。

test 0 -eq 0 && (test -0 -eq 1 || test 1 -eq 1)
test 0 -eq 0 && { test -0 -eq 1 || test 1 -eq 1; }

パターンを見るのは簡単です。testfor式で使用されているすべての演算子は、シェル内の対応するforコマンドに置き換えられます。

test "$1" -a "$2"に交換する必要がありますかtest "$1" && test "$2"、またはに交換する必要がありますか(( test "$1" && test "$2" ))

算術式を評価することが目的であるため、命令の終了状態に関係なく算術拡張のためにtest "$1" && test "$2"。に変更する必要があります。(())たとえば、次は有効です。

(( $(test 1 -eq 1 && echo $?) && $(test 0 -eq 0 && echo $?) ))

0(コマンドの置き換えに注意してください。内部コマンドの終了ステータスに置き換えられ、評価された0式は実際にはです(( 0 && 0 ))。)

ただし、これにより構文エラーが発生します。

(( test 1 -eq 1 && test 0 -eq 0 ))
$ (( test 1 -eq 1 && test 0 -eq 0 ))
bash: ((: test 1 -eq 1 && test 0 -eq 0 : syntax error in expression (error token is "1 -eq 1 && test 0 -eq 0 ")

おすすめ記事