`Error de sintaxis:" ("inesperado` al crear una matriz

37

Tengo dos servidores Linux (Debian). Estoy creando un script de shell.

En el primero creo una matriz así:

#!/bin/bash
target_array=(
    "/home/user/direct/filename -p123 -r"
)

Eso funciona bien Pero cuando ejecuto esto en el otro servidor me sale:

Syntax error: "(" unexpected

Por lo que puedo decir, ambos servidores son iguales. ¿Alguien puede arrojar algo de luz sobre por qué esto no funciona?

Si lo escribo en la terminal directamente, ¿está bien?


Parece que cuando lo ejecuto como

sh scriptname.sh

Me sale el error, pero si lo ejecuto como

./scriptname.sh

Parece estar bien. ¿Cual es la diferencia?

IGGt
fuente
¿Copiaste el script entre los dos servidores? intenta cat -v <script>ver si hay char espurias.
LilloX
2
shno bashlo está y lo está ejecutando como sh scriptname.shestá mal
Eric Renouf

Respuestas:

56

Cuando lo usa, ./scriptname.shse ejecuta con /bin/bashcomo en la primera línea con #!. Pero cuando lo usas sh scriptname.shse ejecuta sh, no bash.

El shshell no tiene sintaxis para crear matrices, pero Bash tiene la sintaxis que usó.

Konstantin Morenko
fuente
OK, eso tiene sentido ahora. Como probablemente pueda ver, soy bastante nuevo en Linux (actualmente estoy tratando de convertir mis scripts de Powershell shell / bash). Seguiré usando ./desde ahora. aplausos
IGGt
Eso no es necesariamente, pero debe haber coordinación entre #!/bin/shy sh script.sh(o #!/bin/bashy bash script.sh)
Konstantin Morenko
3
El lenguaje sh no tiene matrices ( a[index]=xo a=(x y)). Algunos intérpretes sh admiten matrices, solo ksh88 (no portado a Linux AFAIK) y algunas variantes antiguas de pdksh serían compatibles a[index]=valuey no a=(x y). En Debian, shgeneralmente dashno tiene soporte de matriz ( a[index]=xno funcionará).
Stéphane Chazelas
1
¡Puedo morir en pedazos de ahora en adelante! :)
Paulo
0

La ejecución ./scriptname.shdará como resultado la lectura de la primera línea del archivo y verá que necesita ejecutar ´ / bin / bash´ y pasar el resto del script al intérprete, mientras que la ejecución sh scriptname.shpasará el archivo al shell estándar del usuario (por ejemplo, Ash) y sea el caso de que ese otro intérprete no admite matrices como lo hace Bash.

dave_alcarin
fuente
1
shno es necesariamente el "shell estándar del usuario", a menudo es su propio ejecutable (o enlace simbólico) y shse invocará para procesar el script. Eso será cierto si incluso si el shell de entrada por defecto para ese usuario esbash
Eric Renouf
Esa era la parte en la que no estaba completamente seguro en este momento. ¡Gracias por la aclaración!
dave_alcarin
0

Con sh scriptname.sh, lo estás ejecutando con sh, no necesariamente con bash. Intenta comparar sh --versionen ambas máquinas. Y / o con dpkg -S $(which sh).

joepd
fuente
Incluso si shes un enlace simbólico bash, se comportará de manera diferente cuando se invoque comosh
Eric Renouf