정규식: 변수 포함

정규식: 변수 포함
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 {} \;

관련 정보