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-

答え2

理解すべき2つのことがあります。

  1. グローブで*マッチ0以上すべての文字

  2. テーブルが${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}

一致するプレフィックスパターンを削除します。パス名拡張と同様に、単語を拡張してパターンを生成します。パターンがパラメータ値の先頭と一致する場合、拡張結果は拡張パラメータ値です。 最短一致パターン#ケース)または最長一致パターン(##ケース)が削除されました。引数が@または*の場合、パターン除去操作は各位置引数に順番に適用され、拡張は結果リストになります。パラメーターが@または*付き添え字付きの配列変数の場合、パターン除去操作は配列の各メンバーに順番に適用され、拡張は結果のリストです。 [強調する。 ]

関連情報