
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 watch
comando 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 watch
uma 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 watch
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 elemento de uma só vez, use &
para evitar esperar que cada watch
comando 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