Errore di sintassi: “(” inaspettato` durante la creazione di un array


37

Ho due server (Debian) Linux. Sto creando uno script di shell.

Sul primo creo un array così:

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

Funziona benissimo. Ma quando eseguo questo sull'altro server ottengo:

Syntax error: "(" unexpected

Per quanto ne so, entrambi i server sono uguali. Qualcuno può fare luce sul perché questo non funziona?

Se lo scrivo direttamente nel terminale, va bene ??


Sembrerebbe che quando lo eseguo come

sh scriptname.sh

Ottengo l'errore, ma se lo eseguo come

./scriptname.sh

sembra essere ok. Qual è la differenza?


Hai copiato e incollato lo script tra i due server? prova cat -v <script>a vedere se ci sono caratteri falsi.
LilloX,

2
shnon è bashe quindi eseguirlo come sh scriptname.shè sbagliato
Eric Renouf

Risposte:


56

Quando lo si utilizza, ./scriptname.shviene eseguito con /bin/bashcome nella prima riga con #!. Ma quando lo sh scriptname.shsi esegue sh, no bash.

La shshell non ha sintassi per creare array, ma Bash ha la sintassi che hai usato.


OK, ora ha senso. Come probabilmente puoi dire, sono abbastanza nuovo su Linux (attualmente sto cercando di convertire i miei script Powershell shell / bash script). Continuerò a utilizzare ./da ora in poi. salute
IGGt

Questo non è necessariamente, ma deve esserci un coordinamento tra #!/bin/she sh script.sh(o #!/bin/bashe bash script.sh)
Konstantin Morenko,

3
Il linguaggio sh non ha matrici ( a[index]=xo a=(x y)). Alcuni interpreti sh supportano array, solo ksh88 (non portato su Linux AFAIK) e alcune varianti pdksh più vecchie potrebbero supportare a[index]=valuee no a=(x y). Su Debian, di shsolito dashnon ha il supporto di array ( a[index]=xnon funzionerà).
Stéphane Chazelas,

1
Da ora in poi posso morire a pezzi! :)
Paulo,

0

L'esecuzione ./scriptname.shcomporterà la lettura della prima riga del file e vedrà che deve eseguire ´ / bin / bash´ e passare il resto dello script all'interprete, mentre l'esecuzione sh scriptname.shpasserà il file alla shell standard dell'utente (es. Ash) ed è il caso che quell'altro interprete non supporti gli array come Bash.


1
shnon è necessariamente la "shell standard dell'utente", spesso è il suo eseguibile (o collegamento simbolico) e shverrà invocato per elaborare lo script. Ciò sarà vero anche se anche se la shell di accesso predefinita per quell'utente èbash
Eric Renouf,

Questa era la parte in cui non ero del tutto sicuro al momento. Grazie per il chiarimento!
dave_alcarin

0

Con sh scriptname.sh, lo stai eseguendo con sh, non necessariamente con bash. Prova a confrontare sh --versionsu entrambe le macchine. E / o con dpkg -S $(which sh).


Anche se shè un link simbolico bash, si comporterà diversamente quando viene invocato comesh
Eric Renouf,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.