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