正则表达式:带有变量

正则表达式:带有变量
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

所以看起来正则表达式的变量有问题我怎样才能给一个数组或一个变量作为正则表达式的参数

外壳信息,MACINTOSH:

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

问题是单引号。变量不会用单引号展开(来自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 {} \;

相关内容