bash:if式の正規表現

bash:if式の正規表現

私のUbuntuコンピュータのスクリプトで次の文字列を宣言します。

DEBUG_PACKAGE_LIST=$(apt-cache search dbg | awk '{ print $1 }' | grep -e "-dbg")

私の質問を理解するのに役立ちますここの出力は次のとおりです。

echo $DEBUG_PACKAGE_LIST >> debug

次のような

if [[ ! $DEBUG_PACKAGE_LIST =~ "[^-a-z0-9]libmagick++5-dbg[a-z]*" ]]; then 
   echo "no contained"; 
fi

$DEBUG_PACKAGE_LISTechoは、「libmagick ++ 5-dbgsym」文字列が含まれていても「含まない」を示します。理由を理解するのに役立ちますか?

デフォルトでは、私の目標はlibmagick ++ 5-dbgを一致させることであり、libmagickの前に空白文字が1つしかないことです。

答え1

バージョンbash3.2以降:

shopt -u compat31
[[ ! $DEBUG_PACKAGE_LIST =~ [^-[:alnum:]]'libmagick++5-dbg' ]];

bash3.1から:

[[ ! $DEBUG_PACKAGE_LIST =~ '[^-[:alnum:]]libmagick\+\+5-dbg' ]];

(これは[a-z]*空の文字列とも一致するため、重複するため常に一致します。)

次の2つの状況に適用できます。

re='[^-[:alnum:]]libmagick\+\+5-dbg'
[[ ! $DEBUG_PACKAGE_LIST =~ $re ]]

答え2

正規表現を引用できません。このような式の右側(使用しない限り)バッシュバージョン>= 3.0-アルファおよび< 3.2-アルファ)。これはリテラル文字列間の比較として扱われます。

また、Bashは次のように使用します。拡張正規表現の場合、特殊文字は=~どこにありますか?+

答え3

正規表現の代わりにシェルパターンを使用してこれを実行できます。文字列の前にスペースを追加すると、最初の要素を他の要素とは異なる方法で処理する必要はありません。

if [[ " $DEBUG_PACKAGE_LIST" = *\ libmagick++5-dbg[a-z]* ]]; then 

(次の必須文字がわかりますか-dbg?パッケージ名はで終わります-dbg。)

関連情報