アスタリスクの役割が変わり続けるのはなぜですか?
CASE 1:
var1=abcd-1234-defg
echo ${var1#*-*} # RESULT: 1234-defg
CASE 2:
stringZ=abcABC123ABCabc
echo `expr match "$stringZ" '\(abc[A-Z]*.2\)'` # RESULT: abcABC12
スターの役割はいつ、どのように決定されますか?
CASE 3:
path_name="/home/bozo/ideas/thoughts.for.today"
echo ${path_name##/*/} # RESULT : thoughts.for.today
/
この場合、エスケープの役割、つまりエスケープを試みる基本的な特性がここに作用していると誤って考えます*
。わかりました、申し訳ありませんが、そのような特殊キャラクターの役割はどのように、誰によって決まりますか?
CASE 4:
var1=abcd--1234-defg
echo ${var1#*-*} # RESULT: -1234-defg & i was expecting 1234-defg
CASE 4はCASE 1と似ていますが、違いがわかりますが、abcd--
予想1234-defg
通り、結果はCASE 1と同じです。
*-*
ケース4の私の説明は次のとおりです。
シェルは - OR -- OR ---が見つかるまでvar1で始まるすべてを探します。
ケース4の解釈が間違っているのはなぜですか?
答え1
それは*
テストで異なる意味を持つからです。
存在するケース1、ケース3そしてケース4、これは次のように使用されます。パターンマッチング。そしてケース2、それ正規表現メタ文字(または数量子またはクリント)。
パターンマッチングでは、*
文字は空の文字列を含むすべての文字列と一致し、example、で始まるすべての文字列とa*
一致しますが、そうではありません。a
a
aa
ab
b
正規表現では、0個以上の*
先行トークンと一致する数量子は、a*
0個以上のa
シーケンスと一致します(''
たとえばa
、、、、、、、)。aa
aaa
ab
b
この点を念頭に置いて、ケース4次のように解釈されます。以下を含むすべての文字列と一致します。-
、パターンマッチングとして使用されるため、議論中の解釈が正規表現として使用されます。
したがって、abcd--1234-defg
最も短い部分文字列の一致は*-*
、abcd-
最も長い一致は完全な文字列です。フォームを使用する${var1#*-*}
とパラメータ拡張$var1
matchから最短の接頭辞を削除するには、matchの最短の接頭辞があるために*-*
取得します。-1234-defg
abcd-
答え2
理解すべき2つのことがあります。
グローブで
*
マッチ0以上すべての文字テーブルが
${var1#*-*}
削除されました。最短マッチ。
したがって、${var1#*-*}
最初のダッシュのみが削除されます。最短マッチ。
完全性のために、コメントは${var1##*-*}
最長の一致を削除します。
はい
以下の各ケースでは、最短一致するプレフィックスが削除されます。
$ var1=abcd-1234-defg
$ echo ${var1#*}
abcd-1234-defg
$ echo ${var1#*-}
1234-defg
$ echo ${var1#*-*}
1234-defg
$ echo ${var1#*-*-}
defg
$ echo ${var1#*-*-*}
defg
上記の状況と##
削除された状況を比較してください最長接頭辞の一致:
$ echo ${var1##*-}
defg
$ echo ${var1##*-*}
$
文書
からman bash
:
${parameter#word} ${parameter##word}
一致するプレフィックスパターンを削除します。パス名拡張と同様に、単語を拡張してパターンを生成します。パターンがパラメータ値の先頭と一致する場合、拡張結果は拡張パラメータ値です。 最短一致パターン(
#
ケース)または最長一致パターン(##
ケース)が削除されました。引数が@または*の場合、パターン除去操作は各位置引数に順番に適用され、拡張は結果リストになります。パラメーターが@または*付き添え字付きの配列変数の場合、パターン除去操作は配列の各メンバーに順番に適用され、拡張は結果のリストです。 [強調する。 ]