この質問に対する回答が見つかりません。重複した質問ならお詫び申し上げます。
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
ファイル名ワイルドカードパターンは、ファイル名を一致させるために使用されます。