Comportamiento de asignación de matriz

En Bash, las matrices a=( 11 22 ) y b=$(echo "11 22") comportan de manera diferente cuando se imprimen.

 $ a=( 11 22 ) $ b=$(echo "11 22") $ echo $b 11 22 $ echo $a 11 

Si queremos imprimir el contenido completo de a tenemos que recurrir a imprimirlo como ${a[*]} , en lugar de $a .

¿Qué explica esta diferencia de comportamiento entre una asignación de matriz por paréntesis y una por sustitución de command?

Para una matriz (digamos arr ), simplemente refiriéndose a la matriz usando la notación de reference de variable habitual $arr es análoga a ${arr[0]} es decir, se refiere al primer elemento de la matriz. Esto es lo que sucede en tu caso.

Si desea consultar todos los elementos de la matriz, casi siempre desea usar "${arr[@]}" , no "${arr[*]}" . Porque, en este último caso, cuando se cita de esta manera, los elementos se muestran como una sola cadena con el primer carácter de IFS como separador, de forma pnetworkingeterminada (cuando IFS es espacio, tabulación, nueva línea), el espacio se convierte en el separador.

En el caso en que ${arr[@]} no esté entre comillas, se expande a todos los elementos de la matriz con la split de palabras y la expansión del nombre de ruta.

Aquí hay un ejemplo para ti:

 $ a=( 11 22 ) $ printf '%s\n' "$a" 11 $ printf '%s\n' "${a[0]}" 11 printf '%s\n' "${a[*]}" 11 22 $ printf '%s\n' "${a[@]}" 11 22 

Ahora, en el caso de b=$(echo "11 22") , simplemente está haciendo la sustitución de commands y dentro de ese echo "11 12" ejecución echo "11 12" (en una subcamada), y el resultado se guarda en la variable b , que no es una matriz . Por lo tanto, obtienes 11 12 cuando echo -ing $b .

Tenga en count que, el lado derecho de la asignación variable no pasa por la split de palabras, por lo tanto, la cadena 11 12 se guarda en la variable b incluso si hay espacio entre ellos.

Gracias por la Nota debajo de @cas:
$ b NO es una matriz, es una cadena que contiene "11 22"

El equivalente a

 a=( 11 22 ) 

Es

 b=($(echo "11 22")) 

Como resultado

 $ a=( 11 22 ) $ b=($(echo "11 22")) $ echo $a 11 $ echo ${a[*]} 11 22 $ echo $b 11 $ echo ${b[*]} 11 22