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 {} \;