
次の変数を定義するとします。
number=123#456
前に「123#」なしで印刷したいです。 (これはzshで10以外の数値を処理するときに発生します。)「パラメータ拡張」マニュアルの一部には次のように記載されています。
${name#pattern}
${name##pattern}
パターンが値の先頭に一致する場合名前を選択し、値を上書きします。名前一致する部分を削除し、そうでない場合は次のものと交換します。名前。最初の形式では最小の一致パターンが優先され、2番目の形式では最大の一致パターンが優先されます。
これが私にとって何を意味するのかは、私が言うことができるはずです。
print ${number#123#}
「123#」を削除すると、実際には「3#456」が出力されます。削除したい「#」をエスケープすると、目的の効果が得られることがわかりました。
print ${number#123\#} # prints "456"
エスケープする前に「#」に特別な意味がありますか?
答え1
#
はグローバルオペレータこれは、「前の文字または角かっこグループが0回以上発生する」ことを意味します。これは正規表現演算子を作成するzshメソッドです*
。したがって、最も短い一致が選択されたときに一致が開始され()、123#
最も長い一致が選択されたときに一致が開始されます()。12
123#456
${number#123#}
123
${number##123#}
オペレータは、#
次の場合にのみアクティブになります。extended_glob
オプションが設定されました。このオプションはデフォルトでは設定されていませんが、通常環境設定で設定(非常に有用で基本的に面倒ではないため)で、完成機能が実行されると常に設定されます。