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?
bash
shell-script
array
IGGt
fuente
fuente

cat -v <script>ver si hay char espurias.shnobashlo está y lo está ejecutando comosh scriptname.shestá malRespuestas:
Cuando lo usa,
./scriptname.shse ejecuta con/bin/bashcomo en la primera línea con#!. Pero cuando lo usassh scriptname.shse ejecutash, nobash.El
shshell no tiene sintaxis para crear matrices, pero Bash tiene la sintaxis que usó.fuente
./desde ahora. aplausos#!/bin/shysh script.sh(o#!/bin/bashybash script.sh)a[index]=xoa=(x y)). Algunos intérpretes sh admiten matrices, solo ksh88 (no portado a Linux AFAIK) y algunas variantes antiguas de pdksh serían compatiblesa[index]=valuey noa=(x y). En Debian,shgeneralmentedashno tiene soporte de matriz (a[index]=xno funcionará).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ónsh 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.fuente
shno es necesariamente el "shell estándar del usuario", a menudo es su propio ejecutable (o enlace simbólico) yshse invocará para procesar el script. Eso será cierto si incluso si el shell de entrada por defecto para ese usuario esbashCon
sh scriptname.sh, lo estás ejecutando consh, no necesariamente conbash. Intenta compararsh --versionen ambas máquinas. Y / o condpkg -S $(which sh).fuente
shes un enlace simbólicobash, se comportará de manera diferente cuando se invoque comosh