Bashで特殊文字の役割を切り替える

Bashで特殊文字の役割を切り替える

アスタリスクの役割が変わり続けるのはなぜですか?

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*一致しますが、そうではありません。aaaaabb

正規表現では、0個以上の*先行トークンと一致する数量子は、a*0個以上のaシーケンスと一致します(''たとえばa、、、、、、、)。aaaaaabb

この点を念頭に置いて、ケース4次のように解釈されます。以下を含むすべての文字列と一致します。-、パターンマッチングとして使用されるため、議論中の解釈が正規表現として使用されます。

したがって、abcd--1234-defg最も短い部分文字列の一致は*-*abcd-最も長い一致は完全な文字列です。フォームを使用する${var1#*-*}パラメータ拡張$var1matchから最短の接頭辞を削除するには、matchの最短の接頭辞があるために*-*取得します。-1234-defgabcd-

おすすめ記事