すべてのPOSIXシェルは算術拡張$((...))を同じように実装しますか? [コピー]

すべてのPOSIXシェルは算術拡張$((...))を同じように実装しますか? [コピー]

私はすべてのPOSIXシェルで動作するシェルスクリプトを作成しようとしていますが、dashこれが他のPOSIX互換シェルで動作するように依存できるのか、それとも依存関係なのか疑問に思います。dashシェルの意図しない機能です。

算術拡張では、変数は初期ドル記号の有無にかかわらず作成できます(常にドル記号などで作成する必要がある場所引数の場合を除く$1$2

しかし、私が見つけた動作は、拡張機能の場合とは"$((X))"異なります。"$(($X))""$(($X))"二重、そして一度だけではありません。つまり、私の変数に次のものがX含まれている場合他の変数の名前X=Y)には数値(Y=1)が含まれており、「無効な数値:Y」エラーで"$(($X))"返され1ます。"$((X))"

この動作は他のPOSIXシェルでも同じであると信じることができますか?

奇妙な行動

"$((X))"そして"$(($X))"別の方法で行動しなさい。

$ X=Y; Y=1
$ echo "$((X))"
dash: 1: Illegal number: Y
$ echo "$(($X))"
1

予想される動作

完全性を期すために、これには間接参照がなく、2 つのレベルの間接参照が含まれます。間接的な方法はなく、すべてが期待どおりに機能します。

$ X=1
$ echo "$((X))"
1
$ echo "$(($X))"
1

予想通り、2つのレベルの間接参照は機能しません(エラーメッセージは異なる値を表します)。

$ X=Y; Y=Z; Z=1
$ echo "$((X))"
dash: 6: Illegal number: Y
$ echo "$(($X))"
dash: 7: Illegal number: Z

この質問はこの質問と多少関連しています。算術拡張とパラメータ拡張しかし、より高いレベルのシェルの動作を処理するので、同じではありませんが、bash予想されるPOSIXの動作を知りたいです。

ベストアンサー1

あなたの質問はPOSIX関連の質問であり、関連する質問に高度なシェルが含まれているようですので、この質問に別々に答えます。

あなたが見ている動作は、2つの異なる種類の拡張、つまりパラメータ拡張と算術拡張から来ます。POSIXはこの順序で指定します。。そして

$ X=Y; Y=1

最初の例では、算術拡張のみを使用します。

$ echo "$((X))"

値をX算術式として解釈しようとしましたが、「Y」が数値ではないため失敗しました。

2番目の例では、次のすべてを使用します。

$ echo "$(($X))"

次に、拡張(パラメータ拡張)されます。

$ echo "((Y))"

次に、算術拡張ではY値1を使用します。

また、見ることができます算術式で間接拡張を使用した変数拡張の2つの例について学びます。そしてBash:算術拡張、パラメータ拡張、およびカンマ演算子待つ。

おすすめ記事