${$#}がシェルで$$と同じ結果を返すのはなぜですか?

${$#}がシェルで$$と同じ結果を返すのはなぜですか?

から最後の位置パラメータセットを取得している間に/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]}

最小プレフィックスパターンの削除。これ言葉パターンを作成するには拡張する必要があります。パラメータ拡張のため範囲、パターンに一致するプレフィックスのうち最も小さい部分を削除します。存在する場合、言葉引用符のない文字で始めることはできません#

%(サフィックス)にも同様に適用されます。パラメータ拡張修飾子では@ない*ため、エラーです。これ$?も仮定的に$-発生します$=${$+}空の拡張です。

関連情報