web-dev-qa-db-ja.com

変数、中括弧、およびbashのハッシュ文字を使用した$ {0 ## ...}構文の意味は何ですか?

よくわからないコードをbashで見ただけです。初心者のbashスクリプト作成者なので、何が起こっているのかわかりません。

echo ${0##/*}
echo ${0}

これら2つのコマンド(スクリプト名を出力)の出力に違いはありません。 #コメントだけですか?そして、/*。コメントの場合、終了の妨げにならない理由}ブレース?

誰かがこの構文について私にいくつかの洞察を与えることはできますか?

43
user215997

Advanced Bash-Scripting Guide‡の サブストリングの削除 に関するセクションを参照してください。

${string#substring}

$stringの前からsubstringの最短一致を削除します。

${string##substring}

$stringの前からsubstringの最長一致を削除します。

サブストリングには、すべてに一致するワイルドカード*を含めることができます。式${0##/*}は、スラッシュで始まる場合を除き、$0の値を出力します。スラッシュで始まる場合は、何も出力されません。

2019ガイドは、2019年3月7日現在、substringが変数の名前であるかのように、誤って$substringであると主張しています。そうではありません:substringは単なるパターンです。

58
Mark Byers

Linuxのヒント:Bashパラメーターとパラメーター展開

${PARAMETER##Word}  Results in removal of the longest matching pattern from the beginning rather than the shortest.
for example
[ian@pinguino ~]$ x="a1 b1 c2 d2"
[ian@pinguino ~]$ echo ${x#*1}
b1 c2 d2
[ian@pinguino ~]$ echo ${x##*1}
c2 d2
[ian@pinguino ~]$ echo ${x%1*}
a1 b
[ian@pinguino ~]$ echo ${x%%1*}
a
[ian@pinguino ~]$ echo ${x/1/3}
a3 b1 c2 d2
[ian@pinguino ~]$ echo ${x//1/3}
a3 b3 c2 d2
[ian@pinguino ~]$ echo ${x//?1/z3}
z3 z3 c2 d2
26
Paul Creasey

bash(1)のmanページのParameter Expansionセクションを参照してください。