Passando valores de array para comandos args

Passando valores de array para comandos args

Estou tentando escrever um script que execute um comando para cada um dos elementos de um array, independentemente do número de valores nele contidos. Porém, a única solução que encontrei é a seguinte (feita com o watchcomando como exemplo):

watch ${ARRAY[0]}

watch ${ARRAY[1]}

watch ${ARRAY[2]}

…sendo o array posiciona outros comandos a serem observados.

Obviamente, definitivamente não é isso que estou procurando, pois depende do número de posições do array que escrevo em 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.

Responder1

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

Agora, para sua pergunta real: você está tentando executar watchuma vez e passar a lista completa de elementos no array, ou deseja executá-lo separadamente para cada elemento, um de cada vez, ou executar uma instância separada para watchcada 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 elemento de uma só vez, use &para evitar esperar que cada watchcomando 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

informação relacionada