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


18

最後の定位置パラメーターを設定しようとしている間に/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

3
何を期待${$*}${$@}、生産しますか?
クサラナンダ

2
@Kusalananda期待はありません。私は他のキャラクターを試してみました#%そしてそれらからどのような行動が起こります。
セルギーコロディアズニー

1
実際にダッシュ、使用中の間接を行うにはeval、例えばdash -c 'set 1 2 3 4 5; eval "echo \$$#"'。出典:Ubuntu Wiki
wjandrea

1
@wjandreaうん、すでにそれを知っている。実際には既に質問があります:stackoverflow.com/questions/1853946 / ...最初に質問を読まずに自分でメソッドを見つけようとしました(そして、for i; do true; done最後のアイテムを入れることは既に知っていました$i)が、もっとエレガントなものを探していました。evalもちろん、潜在的な問題を抱えている可能性があり、どの程度まで考えられます-それは別のトピックです。しかし、はい、それはオプションだ
Sergiy Kolodyazhnyy

回答:


35

これは$$ 空のプレフィックスを削除したものです:

${parameter#[word]}

最小プレフィックスパターンを削除します。言葉は、パターンを生成するために拡張されなければなりません。その後、パラメータ拡張によりparameterが生成され、パターンに一致するプレフィックスの最小部分が削除されます。存在する場合、単語は引用符なしで始まってはならない#

同じことが%(サフィックス)にも当てはまります。@そして、*拡張修飾子パラメータではありませんので、彼らはエラーです。それはのために起こる$?$-または仮想的な$=だけでなく、。${$+}空の展開です。


そこですぐにパラメータの置換を認識する必要がありました。良いキャッチ。
セルギーコロディアズニー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.