アスタリスクの役割が変わり続けるのはなぜですか?
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-