0 votos

zsh/bash string to array no funciona usando paréntesis

¿Sabes por qué lo siguiente no convierte la cadena en array?

  STR="one two three"
  array=("$STR")

  echo "${array[@]}" # prints: one two three
  echo "len: ${#array[@]}" # prints: len: 1
  echo "item: ${array[2]}" # prints: <nothing>

3voto

Michael Zhou Puntos 167

El valor de STR es un elemento en su matriz debido a las comillas. Podrías rellenar tu array como-

array=(one two three)

Matrices en zsh comienzan en 1 y no en 0 como en ksh y bash .

3voto

thrig Puntos 101

En ZSH puedes utilizar un expansión de parámetros . Aquí, el s: : La expansión se utiliza para s plir la cadena en que podría ser difícil de ver; podríamos llamarlo valor decimal ASCII 32 o simplemente espacio.

% string="foo bar"
% array=(${(s: :)string})
% print $array[1]
foo

El bash El código de esta página no es realmente seguro en todas las condiciones. El shell POSIX hace por defecto un auto-split (que en este caso es deseado) y un auto-glob (que puede ser muy indeseable; si algún carácter glob entra en el string y luego coinciden con los archivos en el directorio de trabajo actual):

bash-5.1$ string="who* foo"
bash-5.1$ array=($string)
bash-5.1$ echo ${array[@]}
whoops.app whoops.png whoops.txt foo
bash-5.1$ printf '%s\n' ${array[@]}
whoops.app
whoops.png
whoops.txt
foo
bash-5.1$ ls whoops.*
whoops.app      whoops.png      whoops.txt

¡¡Sorpresa!!

(ZSH no es compatible con POSIX, por lo que no hace lo de dividir automáticamente las variables sin comillas (por defecto), gracias a Dios).

1voto

Jason Puntos 68

He comprobado que esto funciona:

bash

 array=($STR) # removed expansion ""

zsh

eval "array=($STR)"

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X