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.sh
nobash
lo está y lo está ejecutando comosh scriptname.sh
está malRespuestas:
Cuando lo usa,
./scriptname.sh
se ejecuta con/bin/bash
como en la primera línea con#!
. Pero cuando lo usassh scriptname.sh
se ejecutash
, nobash
.El
sh
shell no tiene sintaxis para crear matrices, pero Bash tiene la sintaxis que usó.fuente
./
desde ahora. aplausos#!/bin/sh
ysh script.sh
(o#!/bin/bash
ybash script.sh
)a[index]=x
oa=(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]=value
y noa=(x y)
. En Debian,sh
generalmentedash
no tiene soporte de matriz (a[index]=x
no funcionará).La ejecución
./scriptname.sh
dará 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.sh
pasará 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
sh
no es necesariamente el "shell estándar del usuario", a menudo es su propio ejecutable (o enlace simbólico) ysh
se invocará para procesar el script. Eso será cierto si incluso si el shell de entrada por defecto para ese usuario esbash
Con
sh scriptname.sh
, lo estás ejecutando consh
, no necesariamente conbash
. Intenta compararsh --version
en ambas máquinas. Y / o condpkg -S $(which sh)
.fuente
sh
es un enlace simbólicobash
, se comportará de manera diferente cuando se invoque comosh