算術拡張がBashでは機能しますが、Zshでは機能しないのはなぜですか?

算術拡張がBashでは機能しますが、Zshでは機能しないのはなぜですか?

私は授業中に学生に興味深いコードを見せて、驚くほどうまくいきましたzsh。その後、に切り替えて期待bashどおりに機能しました。

コードは以下のように表示されます。

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

期待どおりにbash印刷されるか、BoomランダムClickに印刷されます。ただし、zsh次のエラーメッセージが表示されます。

zsh:=見つかりません

違いが何であるかを説明できる人はいますか?私が理解したのは、両方のシェルがスクリプトを同じように解釈することです。

ありがとうございます。

答え1

もう一度やり直しunsetopt equalsてください。または、最初の等しい文字の周りに引用符を入れます。

for条件を使用すると、[すべてのパラメータが正常に評価され、単語の先頭にある=はコマンド位置を取得するのに便利なzshショートカットです。たとえば=ls/bin/ls与えられた==zsh find=コマンドが見つかりません。

posixモード(shシミュレーション)では、Zshとbashの間の互換性がはるかに良くなります。互換性のある部分が多く、学んだほとんどのbashの知識はまだ有用ですが、移植可能なスクリプトを書くには知っておくべきことがいくつかあります。

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

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

実際、ゼロとの比較はさらに重複しています。なぜなら、デフォルトの戻り状態は値がゼロかどうかを反映するからです。反対の意味を持っていますが、言葉です:

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

関連情報