文字列内のパターンを見つけるシェルテスト

文字列内のパターンを見つけるシェルテスト

一般的なシェル(bash、dash、kornshell)で実行できるコマンドがあるかどうかを尋ねたかったです。line変数にパスの一部が含まれていることを確認する必要があります。

if [[ $line =~ "$PWD"$ ]] ;then

ベストアンサー1

POSIX準拠のシェルでは、次のことができます。

case $line in (*"$PWD"*)
#    whatever your then block had
;;esac

これはbash、、、dashおよび名前を付けることができる他のすべてのシェルで機能します。

また、複数の可能性を簡単に処理するために使用することもできます。たとえば、

case $line in 
(*"$PWD"*)
    echo \$PWD match\!
;;
(*"$OLDPWD"*)
    echo \$OLDPWD match\!
;;
(*)
    ! echo no match\!
;;esac

シフトを使用することもできます。

case $line in (*"$PWD"*|*"$OLDPWD"*)
    echo '$OLDPWD|$PWD match!'
;;esac

上記の引用の使用に注意してください。

  1. case $line ...
    • ステートメントのオブジェクトはcase分割されたり、$IFSファイル名 gen のパターンとしては使用されません。これは[[テストで左パラメータを処理する方法と似ています。
  2. (*"$PWD"*)
    • ここで、シェル拡張は$IFSファイル名の生成に影響されません。引用符のない拡張子は分割されたり、ワイルドカードとして指定されたりしません。
    • ただし、ここで引用されていない拡張はリテラル文字列ではなくパターンとして解釈される可能性があるため、拡張は引用の有無に応じて複数の意味を持つことがあります。
    • 文字通り解釈されるパターン文字を参照することが重要であるかのように、文字通り解釈されるべきパターンで使用されるすべての変数を引用することが重要です。
    • たとえば、$PWDaが含まれていて引用符がない場合、検索するリテラルではなくパターンオブジェクト*として解釈されます。*

おすすめ記事