Itera en dos arreglos simultáneamente en bash

Tengo dos arreglos

array=( Vietnam Germany Argentina ) array2=( Asia Europe America ) 

Quiero recorrer estas dos matrices simulaneamente, es decir, invocar un comando en los primeros elementos de las dos matrices, luego invocar el mismo comando en los segundos elementos, y así sucesivamente. Pseudocódigo:

 for c in $(array[*]} do echo -e " $c is in ......" done 

¿Cómo puedo hacer esto?

De la respuesta de anishsane y de los comentarios allí, ahora sabemos lo que quieres. Esto es lo mismo en un estilo bashier , utilizando un bucle for. Consulte la sección Construcciones de bucle en el manual de referencia . También estoy usando printf lugar de echo .

 #!/bin/bash array=( "Vietnam" "Germany" "Argentina" ) array2=( "Asia" "Europe" "America" ) for ((i=0;i<${#array[@]};++i)); do printf "%s is in %s\n" "${array[i]}" "${array2[i]}" done 

Otra posibilidad sería usar una matriz asociativa:

 #!/bin/bash declare -A continent continent[Vietnam]=Asia continent[Germany]=Europe continent[Argentina]=America for c in "${!continent[@]}"; do printf "%s is in %s\n" "$c" "${continent[$c]}" done 

Dependiendo de lo que quieras hacer, podrías considerar esta segunda posibilidad. Pero tenga en cuenta que no podrá controlar fácilmente el orden en que se muestran los campos en la segunda posibilidad (bueno, es una matriz asociativa, por lo que no es realmente una sorpresa).

Si todas las matrices están ordenadas correctamente, simplemente pase alrededor del índice.

 array=( Vietnam Germany Argentina ) array2=( Asia Europe America ) for index in ${!array[*]}; do echo "${array[$index]} is in ${array2[$index]}" done Vietnam is in Asia Germany is in Europe Argentina is in America 

Necesitas un loop sobre array y array2

 i=0 while [ $i -lt ${#array[*]} ]; do echo ${array[$i]} is in ${array2[$i]} i=$(( $i + 1)); done Vietnam is in Asia Germany is in Europe Argentina is in America 

Alternativamente, puede usar esta opción (sin bucle):

 paste <(tr ' ' '\n' <<< ${array[*]}) <(tr ' ' '\n' <<< ${array2[*]}) | sed 's/\t/ is in /'