Ich versuche, das erste Zeichen einer Variablen zu erhalten, aber ich erhalte einen fehlerhaften Ersetzungsfehler. Kann mir jemand helfen, es zu reparieren?
code ist:
%Vor%Tue ich etwas falsch oder gibt es einen besseren Weg, dies zu tun?
- BEARBEITEN -
Wie gewünscht - hier ist eine Beispieleingabe, die in /some/file.txt
gespeichert ist %Vor%Um das erste Zeichen einer Variablen zu erhalten, müssen Sie sagen:
%Vor%Ihr Code weist jedoch einen Syntaxfehler auf:
%Vor%Also kann das den Trick machen:
%Vor%Es kann auch so gemacht werden:
%Vor%Basierend auf Ihrem Update funktioniert das für mich:
%Vor%Das Hinzufügen des fehlenden Speicherplatzes (wie in fedorquis Antwort ;) vorgeschlagen) funktioniert für mich.
Das würde ich in Bash machen, wenn ich das erste Zeichen einer Zeichenkette überprüfen möchte
%Vor% Auf der rechten Seite von ==
wird der zitierte Teil buchstäblich behandelt, während *
ein Platzhalter für eine beliebige Zeichenfolge ist.
Weitere Informationen finden Sie im letzten Teil von Conditional Constructs von Bash Referenzhandbuch:
Wenn die Operatoren '==' und '! =' verwendet werden, wird die Zeichenfolge rechts vom Operator als Muster betrachtet und gemäß den unten in Musterabgleich
Wenn Sie Fehler wie " Falscher Substitutionsfehler " und " [[: nicht gefunden " erhalten (siehe Kommentar ) obwohl Ihre Syntax ist in Ordnung (und funktioniert gut für andere), könnte es bedeuten, dass Sie benutzen die falsche Shell (also nicht Bash).
Um sicherzustellen, dass Sie Bash verwenden, um das Skript auszuführen,
#!/bin/bash
aus
Beachten Sie auch, dass sh nicht unbedingt bash ist, manchmal strich (z. B. in Ubuntu) oder einfach nur Bourne-Shell .
Versuchen Sie Folgendes:
%Vor% oder Sie können Folgendes für Ihre if
-Syntax verwenden:
TIMTOWTDI ^^
%Vor%Hinweis: Ich habe das Eval weggelassen, was in einigen (seltenen!) Fällen erforderlich sein könnte (und in der Regel gefährlich ist).
Anmerkung2: Ich fügte eine "sicherere" IFS & amp; Lesen Sie (-r, roh), aber Sie können zu Ihrem eigenen zurückkehren, wenn es besser geeignet ist. Beachten Sie, dass es immer noch Zeile für Zeile liest.
Anmerkung3: Ich habe mir angewöhnt, immer $ {var} anstelle von $ var zu verwenden ... funktioniert für mich (einfach, um Vars in komplexem Text zu finden, und einfach zu sehen, wo sie zu allen Zeiten beginnen und enden) hier nicht nötig.
Hinweis4: Sie können den Test auch in *"#"*)
ändern, wenn einige der (Kommentare?) Zeilen Leerzeichen oder Tabulatoren vor dem '#' haben dürfen (und keine der Symlink-Zeilen enthält ein '#')
Tags und Links bash