String-Ersetzung im Bash-Skript „Ungültige Ersetzung“

String-Ersetzung im Bash-Skript „Ungültige Ersetzung“

Ich versuche einen einfachen String-Ersatz in einem Bash-Skript:

#!/bin/bash
x="I love Linux"
echo "${x/Linux/Unix}"

Auf meinem Mac funktioniert es einwandfrei, aber auf meinem Server nicht. Ich habe verschiedene Beispiele von verschiedenen Websites ausprobiert, aber ich erhalte immer den Fehler: Bad substitution

Meine Bash-Version:GNU bash, Version 4.4.12(1)-release (x86_64-pc-linux-gnu)

Was mache ich falsch?

Antwort1

echo "${x/Linux/Unix}"ist die korrekte Syntax in Bash seit Version 2.0, die 1996 veröffentlicht wurde.

Bash gibt nicht die exakte Fehlermeldung aus Bad substitution. Die Meldung, wenn etwas auftritt, das fast, aber nicht ganz wie eine Parametersubstitution aussieht, ist etwas anders:

$ bash -c '${}'
bash: ${}: bad substitution

Andererseits gibt dash, die Implementierung von /bin/shauf vielen Linux-Systemen, genau diese Meldung aus:

$ dash -c 'echo "${x/Linux/Unix}"'
dash: 1: Bad substitution

Der Fehler ist ein ausreichender Hinweis darauf, dasswie Kusalananda bemerkte, Sie führen dieses Skript nicht wirklich als Programm aus: Sie führen vermutlich ein Programm aus shoder /bin/shund sagen ihm, dass es dieses Skript ausführen soll. Ihr Skript ist ein korrektes Bash-Programm, aber kein korrektes Sh-Programm. Es funktioniert also nicht auf Systemen, auf denen Sh ein anderer Dialekt ist, der nicht über denselben Funktionsumfang wie Bash verfügt.

Ihr Skript ist ein eigenständiges Programm.siebangZeile oben im Skript teilt dem System mit, welcher Interpreter verwendet werden soll. Um das Skript auszuführen, geben Sie einfach seinen Pfad oder seinen Dateinamen ein, wenn es sich im Befehlssuchpfad befindet ( $PATH). Wie jedes andere ausführbare Programm, egal ob es ein Skript ist (hat eine Shebang-Zeile) oder nicht (eine Binärdatei, die der Kernel selbst ausführt 1 ), muss es über Ausführungsberechtigungen verfügen ( chmod +x path/to/script). Wenn Sie aus irgendeinem Grund ein Skript haben, das kein eigenständiges Programm ist, und Sie es mit Bash ausführen möchten, führen Sie aus bash path/to/script, nicht sh path/to/script.

1 Oder mit anderen Mitteln, um mitzuteilen, wie die Datei ausgeführt werden soll, wie etwa dem binfmt_misc-Mechanismus unter Linux.

verwandte Informationen