シェルIF文でgrep -qで関係演算子を使用しますか?

シェルIF文でgrep -qで関係演算子を使用しますか?

この質問に対する回答が見つかりません。重複した質問ならお詫び申し上げます。

BSD/bin/shでは(いいえ強く打つ! )、次のIFステートメントの構文を見つけようとしています。

2つの構成規定があります。別のステートメントで作成すると、次のようになります。

if [ "$a" == "y" -o "$a" == "Y" ]; then
    if printf '%s' "$b" | grep -qE 'SOME_REGEX'; then
        # both conditions met: do stuff
    fi
fi

ifしたがって、回避策としてネストを使用できます。

しかし、「if」ステートメントできれいに結合するにはどのような構文が必要ですか?

[ "$a" =~ REGEX" ]注:このシェルがrequireの代わりに直接正規表現の一致比較(または類似)を許可するかどうかを知っておくと便利ですgrep -q。しかし、いつかは間違いなく一致ファイルを持つことになるので、句を正しく設定する方法をまだ知りたいと思います。内容と2番目の文と同様の状況ls -l "$b" | grep -qE 'SOME_REGEX'なので、インライン正規表現の比較は機能しません... :)

ベストアンサー1

個人的には、ここに入れ子になったドアを使うのは大丈夫だと思いますif。少しより現代的な構文を使用したいと思います。

if [ "$a" = "y" ] || [ "$a" = "Y" ]; then
    if printf '%s' "$b" | grep -qE 'SOME_REGEX'; then
        # both conditions met: do stuff
    fi
fi

(これは-ism==ですbash

それらを組み合わせると(IMHOは読みやすくなります):

if [ "$a" = "y" ] || [ "$a" = "Y" ] && printf '%s' "$b" | grep -qE 'SOME_REGEX'; then
    # both conditions met: do stuff
fi

~のため基本的な使用できる正規表現expr(参照以下はStéphane Chazelasのコメントです。):

if [ "$a" = "y" ] || [ "$a" = "Y" ] && expr "$b" : 'SOME_REGEX' >/dev/null; then
    # both conditions met: do stuff
fi

シェルは通常、拡張正規表現マッチングを実行する/bin/sh必要はありません。[[ ... =~ ... ]]


最後の注意:1行にわたって一致する正規表現テキスト。ファイル名がテキストとして扱われると、改行文字を含むファイル名など、1行のテキスト以外のファイル名が自動的に失格になります。ファイル名に一致する正規表現を適用する必要がある場合は、配列$@(in)に格納されている名前に注意するか、述語をサポートする/bin/sh実装を使用してください。find-regex

ファイル名ワイルドカードパターンは、ファイル名を一致させるために使用されます。

おすすめ記事