Passando valores de array para argumentos de comando

0

Estou tentando escrever um script que execute um comando para cada um dos elementos de uma matriz, independentemente do número de valores nela. No entanto, a única solução que obtenho é a seguinte (feita com o comando watch como exemplo):

watch ${ARRAY[0]}

watch ${ARRAY[1]}

watch ${ARRAY[2]}

... sendo o array posiciona outros comandos para serem assistidos.

Obviamente, isso definitivamente não é o que estou procurando, pois isso depende do número de posições de matriz que escrevo no meu código, e isso é claramente um problema. Eu tentei algo como:

watch "${ARRAY[*]}"

... mas não funcionou, com ou sem aspas duplas. Qualquer sugestão será apreciada.

    
por xvlaze 24.06.2016 / 12:09

1 resposta

3

Primeiro, você quase nunca deve usar ${ARRAY[*]} , com ou sem aspas. Em quase todas as situações, você deve usar "${ARRAY[@]}" ( com as aspas duplas). Segundo, você deve usar nomes de variáveis em minúsculas ou em letras maiúsculas para evitar usar acidentalmente um nome que signifique algo especial para o shell ou um dos programas executados a partir dele.

Agora, para sua pergunta real: você está tentando executar watch uma vez e passar a lista completa de elementos na matriz, ou deseja executá-la separadamente para cada elemento, um por vez, ou executar uma instância separada de watch para cada elemento de uma só vez? Para executá-lo uma vez com a lista completa, use:

watch "${array[@]}"

Para executá-lo separadamente em cada elemento, um de cada vez, use:

for element in "${array[@]}"; do
    watch "$element"
done

Para executá-lo separadamente em cada tipo de elemento de uma vez, use & para evitar esperar que cada comando watch termine antes de iniciar o próximo:

for element in "${array[@]}"; do
    watch "$element" &
done
wait   # this waits for all of the 'watch' processes to exit before continuing through the script
    
por 25.06.2016 / 06:39

Tags