正規表現:変数を含む

正規表現:変数を含む
arrFormat=( jpg jpeg bmp tiff png )
varExtension="jpg"

for elem in "${arrFormat[@]}"
do
  echo "${elem}"
  # do something on $elem #
done


#for i in $( find -E . -iregex '.*\.($arrFormat)' )  ; do   #problem
#for i in $( find -E . -iregex '.*\.("$arrFormat")' )  ; do #problem
#for i in $( find -E . -iregex '.*\.($varExtension)' )  ; do        #problem
#for i in $( find -E . -iregex '.*\.("$varExtension")' )  ; do  #problem

for  i in $( find -E . -iregex '.*\.(jpg|png)' )  ; do # this works fine

  echo "${i}"
  # do something on $i #
done

それでは正規表現の変数に問題があるようです。配列または変数を正規表現のパラメータとしてどのように提供できますか?

シェル情報、マッキントッシュ:

Darwin Kernel Version 15.3.0: Thu Dec 10 18:40:58 PST 2015; root:xnu-3248.30.4~1/RELEASE_X86_64 x86_64

ベストアンサー1

問題は一重引用符です。変数は単一引用符(from man bash)には拡張されません。

文字を一重引用符で囲むと、引用符内の各文字のリテラル値が保持されます。

変数を使用するには二重引用符が必要です。表示するには:

$ foo="bar"
$ echo '$foo'
$foo
$ echo "$foo"
bar

したがって、あなたの場合は、次のようなものが必要です。

for i in $( find -E . -iregex ".*\.$varExtension")  ; do  

または上記の内容よりも優れています。奇妙なファイル名を処理できません:

find -E . -iregex ".*\.$varExtension" -print0 | while IFS= read -r -d '' i; do

あるいは、ループを忘れてfind自分に合った作業をしてください。

find -E . -iregex ".*\.$varExtension" -exec something {} \;

おすすめ記事