web-dev-qa-db-ja.com

算術展開がBashでは機能するがZshでは機能しないのはなぜですか?

私はクラスの生徒に面白いコード(またはそう思う)を示していましたが、驚いたことに、それはzshでは機能しませんでした。次にbashに切り替えたところ、期待どおりに動作しました。

コードは次のとおりです。

[ $(( $RANDOM % 6 )) == 0 ] && echo "Boom" || echo "Click"

bashでは、期待どおりにBoomまたはClickがランダムに出力されます。しかしzshでは、以下のエラーメッセージが表示されます。

zsh:=見つかりません

違いは何ですか?私の理解では、両方のシェルがスクリプトを同等の方法で解釈する必要があります。

ありがとう。

5
Jeff

unsetopt equalsを試して、もう一度お試しください。または、最初のイコール文字に引用符を付けます。

条件に[を使用する場合、すべての引数は通常どおりに評価され、Wordの先頭にある=は、コマンドの場所を取得するための便利なzsh省略形です。例えば=ls/bin/lsに展開されます。 ==を指定すると、zshは=コマンドを探しますが、見つかりません。

PosixモードのZsh(shエミュレーション)は、bashとの互換性が大幅に向上します。多くのものが互換性があり、bashのほとんどの学習された知識はまだ役に立ちますが、移植可能なスクリプトを作成する場合に注意する必要がある特定の事項があります。

組み込みの[とは異なり、[[はパーサーが理解できる予約語であり、問​​題が少なくなります。ただし、この場合は算術モードを使用しているため、単純化しています。

    (( RANDOM % 6 == 0 )) && echo "Boom" || echo "Click"

実際、ゼロとの比較は不必要です。なぜなら、デフォルトの戻りステータスは、値がゼロかどうかを反映しますが、意味が逆になります。

    (( RANDOM % 6 )) && echo "Click" || echo "Boom"
10
okapi