
Hier ist ein Teil meines Skripts, der mir sagt, dass ich in Zeile 3 zu viele Argumente habe:
#!/bin/bash
export LC_ALL='C'
if [ `echo "*file 2" | grep -o ^.` = '.' ]
then
echo success
fi
Weiß jemand warum? Soweit ich das beurteilen kann, vergleiche ich nur zwei Argumente, "*" und "."
Antwort1
echo "*file 2" | grep -o ^.
druckt *
.
Da Sie eine Befehlsersetzung außerhalb von Anführungszeichen haben, wird sie einem Globbing (auch bekannt als Platzhalterübereinstimmung oder Dateinamengenerierung) und einer Worttrennung unterzogen. Wenn das aktuelle Verzeichnis nicht leer ist, *
wird es auf die Liste der Dateien im aktuellen Verzeichnis erweitert. Jede Datei wird zu einem Token im [
Befehl, was höchstwahrscheinlich ein Syntaxfehler ist.
Das Problem besteht darin, dass Sie die Befehlsersetzung nicht in Anführungszeichen gesetzt haben.Verwenden Sie immer doppelte Anführungszeichen um Variablen- und Befehlsersetzungenes sei denn, Sie haben einen guten Grund, sie wegzulassen.
if [ "$(echo "*file 2" | grep -o ^.)" = '.' ]
SehenWarum gerät mein Shell-Skript ins Stocken, wenn es sich um Leerzeichen oder andere Sonderzeichen handelt?für eine ausführlichere Erklärung.