
Estoy intentando escribir un script que ejecute un comando para cada uno de los elementos de una matriz, independientemente de la cantidad de valores que contenga. Sin embargo, la única solución que se me ocurre es la siguiente (hecha con el watch
comando como ejemplo):
watch ${ARRAY[0]}
watch ${ARRAY[1]}
watch ${ARRAY[2]}
…siendo la matriz posiciones otros comandos para ser observados.
Obviamente, esto definitivamente no es lo que estoy buscando, ya que depende de la cantidad de posiciones de la matriz que escribo en mi código, y eso es claramente un problema. He probado algo como:
watch "${ARRAY[*]}"
…pero no funcionó, con o sin comillas dobles. Cualquier sugerencia será apreciada.
Respuesta1
En primer lugar, casi nunca debes utilizar ${ARRAY[*]}
, ya sea con o sin comillas. En casi todas las situaciones, debes usar "${ARRAY[@]}"
(conlas comillas dobles) en su lugar. En segundo lugar, debe utilizar nombres de variables en minúsculas o mixtas para evitar el uso accidental de un nombre que signifique algo especial para el shell o uno de los programas que ejecuta desde él.
Ahora, para su pregunta real: ¿está intentando ejecutar watch
una vez y pasarle la lista completa de elementos de la matriz, o desea ejecutarlo por separado para cada elemento, uno a la vez, o ejecutar una instancia separada para watch
cada uno ? elemento todo a la vez? Para ejecutarlo una vez con la lista completa, use:
watch "${array[@]}"
Para ejecutarlo por separado en cada elemento uno a la vez, use:
for element in "${array[@]}"; do
watch "$element"
done
Para ejecutarlo por separado en cada elemento a la vez, use &
para evitar esperar a watch
que finalice cada comando antes de comenzar el siguiente:
for element in "${array[@]}"; do
watch "$element" &
done
wait # this waits for all of the `watch` processes to exit before continuing through the script