Syntaxfehler: "(" unerwartet "beim Erstellen eines Arrays

36

Ich habe zwei (Debian) Linux-Server. Ich erstelle ein Shell-Skript.

Auf dem ersten erstelle ich ein Array so:

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

Das funktioniert gut. Aber wenn ich das auf dem anderen Server laufen lasse, bekomme ich:

Syntax error: "(" unexpected

Soweit ich das beurteilen kann sind beide Server gleich. Kann jemand etwas Licht ins Dunkel bringen, warum dies nicht funktioniert?

Wenn ich es direkt in das Terminal eingebe, ist es in Ordnung?


Es scheint, dass, wenn ich es als laufen lasse

sh scriptname.sh

Ich bekomme den Fehler, aber wenn ich es als laufen lasse

./scriptname.sh

es scheint in Ordnung zu sein. Was ist der Unterschied?

IGGt
quelle
Haben Sie das Skript zwischen den beiden Servern kopiert? versuche cat -v <script>zu sehen, ob es falsche Zeichen gibt.
LilloX
2
shist nicht bashund so läuft es sh scriptname.shfalsch
Eric Renouf

Antworten:

56

Wenn Sie es verwenden, wird ./scriptname.shes /bin/bashwie in der ersten Zeile mit ausgeführt #!. Aber wenn Sie es verwenden, wird sh scriptname.shes ausgeführt sh, nicht bash.

Die shShell hat keine Syntax zum Erstellen von Arrays, aber Bash hat die von Ihnen verwendete Syntax.

Konstantin Morenko
quelle
OK, das macht jetzt Sinn. Wie Sie wahrscheinlich feststellen können, bin ich ziemlich neu in Linux (ich versuche gerade, meine Powershell-Skripte in Shell / Bash-Skripte umzuwandeln). Ich werde mich ./von nun an an an die Verwendung halten . prost
IGGt
Das ist nicht unbedingt notwendig, aber es muss eine Koordination zwischen #!/bin/shund sh script.sh(oder #!/bin/bashund bash script.sh) geben
Konstantin Morenko
3
Die Sprache sh hat keine Arrays ( a[index]=xoder a=(x y)). Einige sh-Interpreter unterstützen Arrays, nur ksh88 (nicht auf Linux AFAIK portiert) und einige ältere pdksh-Varianten würden dies unterstützen a[index]=valueund nicht a=(x y). Unter Debian gibt shes normalerweise dashkeine Array-Unterstützung ( a[index]=xfunktioniert nicht).
Stéphane Chazelas
1
Ich kann von jetzt an in Stück sterben! :)
Paulo
0

Beim Ausführen ./scriptname.shwird die erste Zeile der Datei gelesen und festgestellt, dass / bin / bash ausgeführt und der Rest des Skripts an den Interpreter übergeben werden muss. Beim Ausführen sh scriptname.shwird die Datei an die Standard-Shell des Benutzers übergeben (z. B. Ash). und sei der Fall, dass dieser andere Interpreter keine Arrays wie Bash unterstützt.

dave_alcarin
quelle
1
shist nicht unbedingt die "Standard-Shell des Benutzers", sondern häufig eine eigene ausführbare Datei (oder ein Symlink) und shwird aufgerufen, um das Skript zu verarbeiten. Dies gilt auch dann, wenn die Standardanmeldeshell für diesen Benutzerbash
Eric Renouf
Das war der Teil, in dem ich im Moment nicht ganz sicher war. Danke für die Klarstellung!
Dave_alcarin
0

Mit sh scriptname.sh, du machst es mit sh, nicht unbedingt mit bash. Versuchen Sie, sh --versionauf beiden Maschinen zu vergleichen. Und / oder mit dpkg -S $(which sh).

joepd
quelle
Auch wenn shes sich um einen Symlink handelt, bashverhält es sich anders, wenn er aufgerufen wird alssh
Eric Renouf