#!/bin/bash
jobname="job_201312161447_0003"
jobname_pre=${jobname:0:16}
jobname_post=${jobname:17}
Dieses Bash-Skript gibt mir einen fehlerhaften Substitutionsfehler unter Ubuntu. Jede Hilfe wird sehr geschätzt.
string
bash
ubuntu
substitution
Arindam Choudhury
quelle
quelle
cut
?cut -d_ -f1,2 <<< "$jobname"
undcut -d_ -f3 <<< "$jobname"
mach essh script.sh
es einen "Bad Substitution" Fehler gibt.Antworten:
Die Standard-Shell (
/bin/sh
) unter Ubuntu zeigt aufdash
, nichtbash
.Wenn Sie es
chmod +x your_script_file.sh
dann ausführen./your_script_file.sh
oder dann ausführenbash your_script_file.sh
, sollte es einwandfrei funktionieren.Das Ausführen mit
sh your_script_file.sh
funktioniert nicht, da die Hashbang-Zeile ignoriert und das Skript von interpretiert wirddash
, was diese Syntax für das Ersetzen von Zeichenfolgen nicht unterstützt.quelle
/bin/bash
damit deine Antwort nicht passt?! Wo liest du, was er benutzt/bin/sh
odersh script.sh
?bad substitution
und versuche nur, Informationen zu sammeln, aber diese Frage hilft nicht, weil sie zu wenige Informationen enthält.Ich hatte das gleiche Problem. Stellen Sie sicher, dass Ihr Skript nicht hatte
oben in Ihrem Skript. Stattdessen sollten Sie hinzufügen
quelle
#!bin/bash
undsh script.sh
es gab mir immer noch die Fehlermeldung. Dann./script.sh
funktioniert.#!/bin/bash
auch die fehlerhafte Ersetzung behoben .#!
Zeile wird nur verwendet, wenn Sie Ihr Skript direkt ausführen. Wenn Siesh script.sh
die Zeile verwenden, wird sie vollständig ignoriert.Für andere, die hier ankommen, wird diese genaue Meldung auch angezeigt, wenn die Syntax der env-Variablen für Befehle verwendet wird, z. B.
${which sh}
anstelle der richtigen$(which sh)
quelle
Ihre Skriptsyntax ist gültig und gut.
Mögliche Fehlerursachen:
Sie
bash
sind nicht wirklich bash, sondernksh
eine andere Shell, die die Parametersubstitution von bash nicht versteht. Weil dein Skript gut aussieht und mit Bash funktioniert. Tun Siels -l /bin/bash
und überprüfen Sie, ob es wirklich Bash ist und nicht mit einer anderen Shell verknüpft ist.Wenn Sie Bash auf Ihrem System haben, führen Sie Ihr Skript möglicherweise falsch aus:
ksh script.sh
odersh script.sh
(und Ihre Standard-Shell ist nicht Bash). Da Sie richtigen Shebang haben, wenn Sie Bash haben./script.sh
oderbash ./script.sh
in Ordnung sein sollten.quelle
/bin/bash
(nicht/bin/sh
) jemals eine andere Shell verwendet würde.Versuchen Sie, das Skript explizit mit dem Befehl bash auszuführen, anstatt es nur als ausführbare Datei auszuführen.
quelle
sh script
undbash script
... mein Vorschlag :)Stellen Sie außerdem sicher, dass Sie keine leere Zeichenfolge für die erste Zeile Ihres Skripts haben.
Stellen Sie also sicher, dass dies
#!/bin/bash
die allererste Zeile Ihres Skripts ist.quelle
Nicht relevant für Ihr Beispiel, aber Sie können auch den
Bad substitution
Fehler in Bash für jede Substitutionssyntax erhalten, die Bash nicht erkennt. Das könnte sein:bash -c '${x }'
bash -c '${x;-}'
bash -c '${x@Q}'
vor Bash 4.4.Wenn Sie mehrere Substitutionen im selben Ausdruck haben, ist Bash möglicherweise nicht sehr hilfreich, um den problematischen Ausdruck zu lokalisieren. Z.B:
quelle
Bad substitution
also dachte ich, ich würde den Fall einschließen, auf den wir gestoßen sind. (Es war@Q
in Bash 4.3 und versteckte sich in einem langen mehrzeiligen Ausdruck.)@Q
des Hinzufügens inbash-4.4
.Beide - Bash oder Dash - funktionieren, aber die Syntax muss lauten:
quelle
Sieht aus wie "+ x" Probleme verursacht:
quelle
Ich habe zweimal ein Dollarzeichen in einen Ausdruck mit geschweiften Klammern in Bash eingefügt:
anstatt
quelle
Ich habe festgestellt, dass dieses Problem entweder durch die markierte Antwort verursacht wird oder dass Sie vor der Bash-Deklaration eine Zeile oder ein Leerzeichen haben
quelle