から最後の位置パラメータセットを取得している間に/bin/dash
これを試しましたecho ${$#}
。驚くべきことに、これはエラーを引き起こすのではなく、$$
変数の内容と同じPIDを生成します。問題は、この構文がなぜ機能するのかです。ここでシェルはどのような構文規則を適用しますか?
基本的に私がしたことは次のとおりです。
$ set 1 2 3 4 5
$ echo ${$#}
13819
$ echo $$
13819
明らかに、%
この構成では役割も無視されます。
$ echo ${$%}
13819
ただし、重大な代替エラーが発生します*
。@
$ echo ${$*}
sh: 10: Bad substitution
$ echo ${$@}
sh: 11: Bad substitution
答え1
これは$$
空のプレフィックスを削除しました。:
${parameter#[word]}
最小プレフィックスパターンの削除。これ言葉パターンを作成するには拡張する必要があります。パラメータ拡張のため範囲、パターンに一致するプレフィックスのうち最も小さい部分を削除します。存在する場合、言葉引用符のない文字で始めることはできません
#
。
%
(サフィックス)にも同様に適用されます。パラメータ拡張修飾子では@
ない*
ため、エラーです。これ$?
も仮定的に$-
発生します$=
。${$+}
空の拡張です。