wake-up-neo.net

Bash: Schlechte Substitution

#!/bin/bash

jobname="job_201312161447_0003"
jobname_pre=${jobname:0:16}
jobname_post=${jobname:17}

Dieses Bash-Skript gibt mir schlechte Ersetzung Fehler auf Ubuntu. Jede Hilfe wird sehr geschätzt.

107

Die Standard-Shell (/bin/sh) Unter Ubuntu zeigt auf dash, nicht auf bash.

[email protected]:~$ readlink -f $(which sh)
/bin/dash

Wenn Sie also chmod +x your_script_file.sh Und dann mit ./your_script_file.sh Ausführen, oder wenn Sie es mit bash your_script_file.sh Ausführen, sollte es funktionieren.

Das Ausführen mit sh your_script_file.sh Funktioniert nicht, da die Hashbang-Zeile ignoriert und das Skript von dash interpretiert wird, das diese Zeichenfolgensubstitutionssyntax nicht unterstützt.

160
Vanni Totaro

Ich hatte das gleiche problem Stellen Sie sicher, dass Ihr Skript nicht hatte

#!/bin/sh 

am oberen Rand Ihres Skripts. Stattdessen sollten Sie hinzufügen

#!/bin/bash
51
Guest

Für andere, die hier ankommen, wird diese genaue Meldung auch angezeigt, wenn die env-Variablensyntax für Befehle verwendet wird, z. B. ${which sh} Anstelle der korrekten $(which sh)

19
Nacho Coloma

Ihre Skriptsyntax ist gültig und gut.

Mögliche Fehlerursachen:

  1. Ihr bash ist nicht wirklich bash, sondern ksh oder eine andere Shell, die die Parameterersetzung von bash nicht versteht. Weil Ihr Skript gut aussieht und mit bash funktioniert. Führen Sie ls -l /bin/bash Aus und überprüfen Sie, ob es sich um eine echte Bash handelt, die nicht mit einer anderen Shell verknüpft ist.

  2. Wenn Sie Bash auf Ihrem System haben, führen Sie Ihr Skript möglicherweise falsch aus: ksh script.sh Oder sh script.sh (Und Ihre Standard-Shell ist kein Bash). Da Sie die richtige Shebang haben, sollte es in Ordnung sein, wenn Sie Bash ./script.sh Oder bash ./script.sh Haben.

19
P.P.

Versuchen Sie, das Skript explizit mit dem Befehl bash auszuführen, anstatt es nur als ausführbare Datei auszuführen.

6
Pale Blue Dot

Stellen Sie außerdem sicher, dass Sie keine leere Zeichenfolge für die erste Zeile Ihres Skripts haben.

stellen Sie sicher, dass #!/bin/bash die erste Zeile Ihres Skripts ist.

2
wizurd

Beide - bash oder dash - funktionieren, aber die Syntax muss lauten:

FILENAME=/my/complex/path/name.ext
NEWNAME=${FILENAME%ext}new
0
Hagen