Bash条件文シーケンスの簡略化

Bash条件文シーケンスの簡略化

私はこれらの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モードを使用することは、最後の点を含む値のすべてを削除することを意味します。$variablepattern*.

この答えで行われたすべてのパターンマッチングは、正規表現ではなくシェルパターンを介して行われます。

関連情報