Estoy tratando de declarar un array vacío en Shell Script, pero estoy experimentando un error.

#!/bin/bash

list=[email protected]

newlist=()

for l in $list; do

        newlist+=($l)

done

echo "new"
echo $newlist

Cuando yo ejecuto, me sale test.sh: 5: test.sh: Syntax error: "(" unexpected

  • El código se ejecuta sin errores
  • Está usted seguro de que se ejecute la secuencia de comandos con bash? Parece que el script se ejecute utilizando sh, en cuyo caso no se admiten matrices.
  • También, la asignación de [email protected] para otro parámetro pierde los beneficios de [email protected], a saber, que el espacio en blanco dentro de un argumento de línea de comandos se conserva. Zanja list y uso for l in "[email protected]"; do directamente.
InformationsquelleAutor luizfzs | 2013-09-20

5 Comentarios

  1. 10

    Ejecutar con bash:

    bash test.sh

    Y ver el error, parece que en realidad se está ejecutando con dash:

    > dash test.sh
    test.sh: 5: test.sh: Syntax error: "(" unexpected

    Sólo que esta vez es probable que use el enlace (/bin/sh -> /bin/dash).

    • Gracias! Runnning bash script.sh trabajado. Pero … ¿por qué con #!/bin/bash se ejecuta en el guión? He escrito export y mi CONCHA se establece en bash.
    • Probablemente a causa de sh. Usted puede ver donde está apuntando con ls -l /bin/sh o readlink $(which sh). Por el camino, el camino más rápido para declarar una variable de matriz newlist base de sus argumentos es newlist=("[email protected]"). Tenga en cuenta que si args es "a b" "c" "d", sin comillas ([email protected]) que se divide en 4 argumentos cuando se expande ("a" "b" "c") debido a la palabra de división, mientras que con "[email protected]" los valores se mantienen como en el espacio.
    • El #! sólo funciona si se ejecuta como un comando de por hacer el archivo ejecutable (chmod +x test.sh) y, a continuación, simplemente escribiendo el nombre del archivo sin ningún tipo de *sh en frente de ella: ./test.sh. Si usted explícitamente escriba el nombre de una concha como sh o bash como el comando a ejecutar, a continuación, que es el comando que se ejecute; y a una concha, la #! línea es solo un comentario.
    • Sí, pero creo que ya significaba que él ejecutó el script con ./test.sh pero dash es todavía el que ha ejecutado
    • si ese fuera el caso habría ejecutado en bash, y no importa lo que /bin/sh está vinculada, porque el shebang línea ha /bin/bash en ella.
    • Estás en lo correcto. No estoy seguro de cómo lo echaba de menos. Todavía dash no han acabado con él, pero él dice que no.

  2. 1

    Probar este a ver si se orientan a dash o bash

    ls -al /bin/sh

    Si dice /bin/sh -> /bin/dash, a continuación, escriba esto:

    sudo rm /bin/sh
    sudo ln -s /bin/bash /bin/sh

    A continuación, escriba de nuevo:

    ls -al /bin/sh*

    debe luego dice algo como esto:

    /bin/sh -> /bin/bash

    Significa que ahora sh está correctamente orientado a Bash y las matrices de trabajo.

  3. 1

    En BASH 4+ puede utilizar el siguiente para declarar un Array vacío:

    declare -a ARRAY_NAME=()

    Luego puede anexar nuevos elementos NEW_ITEM1 & NEW_ITEM2 por:

    ARRAY_NAME+=(NEW_ITEM1)
    ARRAY_NAME+=(NEW_ITEM2)

    Por favor, tenga en cuenta que los paréntesis () se requiere mientras que la adición de nuevos elementos. Esto es necesario para que los nuevos elementos se anexan como un elemento de la Matriz. Si usted hizo perder el (), NEW_ITEM2 se convertirá en una Cadena de anexar al primer Elemento de la Matriz ARRAY_NAME[0].

    Ejemplo anterior se traducirá en:

    echo ${ARRAY_NAME[@]}
    NEW_ITEM1 NEW_ITEM2
    
    echo ${ARRAY_NAME[0]}
    NEW_ITEM1
    
    echo ${ARRAY_NAME[1]}
    NEW_ITEM2

    Siguiente, si usted realiza (nota la falta paréntesis):

    ARRAY_NAME+=NEW_ITEM3

    Esto resultará en:

    echo ${ARRAY_NAME[@]}
    NEW_ITEM1NEW_ITEM3 NEW_ITEM2
    
    echo ${ARRAY_NAME[0]}
    NEW_ITEM1NEW_ITEM3
    
    echo ${ARRAY_NAME[1]}
    NEW_ITEM2

    Gracias a @LenW para la corrección de mí en la operación de anexión.

    • Lo siento, pero el uso de += es incorrecta. Desea anexar una lista a la matriz, por lo que la anexa elemento(s) necesita ser incluido en (…) . Sin los paréntesis, la array_name se refiere a su primera (aka 0-th) el elemento, y la anexa elemento se añade al primer elemento.
    • gracias he corregido la operación de anexar y explicó el uso de la.
  4. -2

    Si la matriz está vacía, basta con hacer:

    NEWLIST=

    Se puede comprobar con:

    if [ $NEWLIST ] ; then
       # do something
    fi

    no vacío declaración del array se parece a esto:

    NEWLIST=('1' '2' '3')

    Para llenar una matriz durante el proceso:

    ARRAY=("$(find . -name '*.mp3')")

    Espero que esto ayude

    • NEWLIST tiene una longitud de 1 en el ejemplo. Intente haciendo eco de ${#NEWLIST[@]} después de ver esto.
    • ofc, eso es normal, pero como mi muestra, el «si» va a trabajar como se debe y mostrar que eso es nada en el interior. Así que la verdadera prueba es si es que existe, no para la comprobación de longitud, que será de 3 en realidad en mi muestra. Tetst, y no downvote algo que funciona correctamente
    • Una matriz vacía es uno con una longitud de 0. NEWLIST no es un conjunto vacío, ya que tiene una longitud de 1. Lo siento, pero no has respondido a la pregunta correctamente. Su if declaración de no probar esto correctamente.
    • esa es su opinión, y su bien. pero es mi opinión que lo que está funcionando bien en todos mis scripts. 🙂
    • En su opinión, una matriz de longitud 1 es «vacío»?
    • me dijo, mi ejemplo está funcionando bien, y la prueba es también correcta, la misma prueba que va bien para cualquier variable. pero de todos modos, he aceptado su opinión, y a pesar de que voy a dejar de discutir. también me dijo, que r derecho, la forma en que se prueba, se devolverá 1. Pero antes de regresar longitud, puede probar con [ var ].

Dejar respuesta

Please enter your comment!
Please enter your name here