私はこれらのbashコマンドシーケンスを持っており、それを単純化したいと思います。どんな助けでも大変感謝します。
[[ "$fl" == *"img"* ]] && mv "$flimg" "$out"
[[ "$fl" == *"png"* ]] && mv "$flimg" "$out"
[[ "$fl" == *"jpg"* ]] && mv "$flimg" "$out"
[[ "$fl" == *"tif"* ]] && mv "$flimg" "$out"
答え1
bashは、すべてのチェックを実行できる拡張正規表現をサポートします。たとえば、次のようになります。
[[ $file =~ (img|png|jpg|tif) ]] && echo do-something
変数かどうかを確認文書与えられた文字列を含みます(私は=~
オペレーター正規表現一致の場合)。
答え2
正規表現の代替として、あまりエレガントなアプローチは次のとおりです。結合された条件文Bashで-を使用すると、OR
デュアルパイプ(||
)になります。
[[ "$fl" == *"img"* || "$fl" == *"png"* || "$fl" == *"jpg"* || "$fl" == *"tif"* ]] && mv "$flimg" "$out"
デュアルパイプはBourneまたはKornシェルでも動作します。単一の括弧([]
)を使用して(Bourneのみ)==
に変更するだけです。=
[ "$fl" = *"img"* || "$fl" = *"png"* || "$fl" = *"jpg"* || "$fl" = *"tif"* ] && mv "$flimg" "$out"
答え3
POSIX標準sh
構文(でも有効)を使用すると、次の文を使用bash
できます。case
case $fl in
*img*|*jpg*|*png*|*tif*)
mv -- "$flimg" "$out"
esac
または「線」で、
case $fl in (*img*|*jpg*|*png*|*tif*) mv -- "$flimg" "$out"; esac
extglob
シェルを有効にするオプションを使用している場合は、shopt -s extglob
次のものも使用できます。
[[ $fl == *@(img|jpg|png|tif)* ]] && mv -- "$flimg" "$out"
ファイル名の最後のドットに続くファイル名のサフィックスのみをテストしたい場合$fl
:
case ${fl##*.} in (img|jpg|png|tif) mv -- "$flimg" "$out"; esac
またはそれshopt -s extglob
以降
[[ ${fl##*.} == @(img|jpg|png|tif) ]] && mv -- "$flimg" "$out"
標準拡張は、一致${variable##pattern}
から最長のプレフィックス文字列を削除します。 asモードを使用することは、最後の点を含む値のすべてを削除することを意味します。$variable
pattern
*.
この答えで行われたすべてのパターンマッチングは、正規表現ではなくシェルパターンを介して行われます。