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?
bash
shell-script
array
IGGt
quelle
quelle
cat -v <script>
zu sehen, ob es falsche Zeichen gibt.sh
ist nichtbash
und so läuft essh scriptname.sh
falschAntworten:
Wenn Sie es verwenden, wird
./scriptname.sh
es/bin/bash
wie in der ersten Zeile mit ausgeführt#!
. Aber wenn Sie es verwenden, wirdsh scriptname.sh
es ausgeführtsh
, nichtbash
.Die
sh
Shell hat keine Syntax zum Erstellen von Arrays, aber Bash hat die von Ihnen verwendete Syntax.quelle
./
von nun an an an die Verwendung halten . prost#!/bin/sh
undsh script.sh
(oder#!/bin/bash
undbash script.sh
) gebena[index]=x
odera=(x y)
). Einige sh-Interpreter unterstützen Arrays, nur ksh88 (nicht auf Linux AFAIK portiert) und einige ältere pdksh-Varianten würden dies unterstützena[index]=value
und nichta=(x y)
. Unter Debian gibtsh
es normalerweisedash
keine Array-Unterstützung (a[index]=x
funktioniert nicht).Beim Ausführen
./scriptname.sh
wird 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ührensh scriptname.sh
wird 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.quelle
sh
ist nicht unbedingt die "Standard-Shell des Benutzers", sondern häufig eine eigene ausführbare Datei (oder ein Symlink) undsh
wird aufgerufen, um das Skript zu verarbeiten. Dies gilt auch dann, wenn die Standardanmeldeshell für diesen Benutzerbash
Mit
sh scriptname.sh
, du machst es mitsh
, nicht unbedingt mitbash
. Versuchen Sie,sh --version
auf beiden Maschinen zu vergleichen. Und / oder mitdpkg -S $(which sh)
.quelle
sh
es sich um einen Symlink handelt,bash
verhält es sich anders, wenn er aufgerufen wird alssh