私はすべての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:算術拡張、パラメータ拡張、およびカンマ演算子待つ。