Pasar valores de matriz a argumentos de comando

Pasar valores de matriz a argumentos de comando

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 watchcomando 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 watchuna 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 watchcada 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 watchque 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

información relacionada