Passando um conjunto de parâmetros para um programa usando uma variável Bash

5

Estou tentando limpar meu shell script colocando parâmetros repetidos em uma variável bash.

A melhor abordagem que eu sei é colocá-lo em uma matriz e passá-lo ... mas isso não parece funcionar. Como posso armazenar todos os parâmetros em uma variável?

Isso não funciona: TESTP=( "-path" "\"./var/*\"") echo ${TESTP[@]} # Results in: -path "./var/*" find ${TESTP[@]} # Returns no results.

Embora find -path "./var/*" retorne todos os arquivos em var.

    
por Ray Foss 09.11.2015 / 15:46

1 resposta

6

Você quer passar esses elementos da matriz como argumentos para find :

TESTP=(-path './var/*')
find . "${TESTP[@]}"

Ou crie uma linha de comando shell e peça ao shell para interpretá-lo (e as aspas nele):

TESTP='-path "./var/*"'
eval "find . $TESTP"

Ou você pode usar o operador split + glob (que você usou inadequadamente deixando sua variável sem aspas na pergunta) em uma variável escalar:

TESTP='-path,./var/*'

set -f # no glob
IFS=,  # split on ,
find . $TESTP

Na sua,

TESTP=( "-path" "\"./var/*\"")
find ${TESTP[@]}

${TESTP[@]} é expandido primeiro para o elemento da matriz ( -path e "./var/*" ), e então cada um está sujeito ao operador split + glob (como você esqueceu de citar), então com o valor padrão de $IFS , eles não seriam divididos, mas como o segundo contém um caractere curinga, ele pode ser expandido para os arquivos cujo nome termina em " no diretório "./var .

O mais provável é que não exista nenhum diretório ". , então ambos os argumentos são deixados como está e passados para find . E isso seria o mesmo que

find -path '"./var/*"'

Ou seja, procurando por arquivos abaixo do diretório "./var que terminam em um caractere " .

    
por 09.11.2015 / 15:52