expressão regular: com uma variável

1
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

Portanto, parece que a expressão regular tem um problema com variável (s) Como posso dar uma matriz ou apenas uma variável como argumento para uma expressão regular

Informação da shell, 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
    
por kris 02.04.2016 / 14:17

1 resposta

5

O problema são as aspas simples. As variáveis não são expandidas entre aspas simples (de man bash ):

Enclosing characters in single quotes preserves the literal value of each character within the quotes.

Se você quiser usar uma variável, você precisa de aspas duplas. Para ilustrar:

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

Então, no seu caso, você quer algo como:

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

Ou, melhor, porque o acima não pode lidar com nomes de arquivos estranhos :

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

Ou, esqueça o loop e tenha find para fazer o trabalho para você:

find -E . -iregex ".*\.$varExtension" -exec something {} \;
    
por 02.04.2016 / 14:27