Ich bin ziemlich neu in Bash-Scripting. Ich habe ein "Testskript", das ich als Grundlage für ein erweitertes / nützliches Skript verwendet habe:
#!/bin/bash
files=$1
for a in $files
do
echo "$a"
done
Wenn ich dies ohne Anführungszeichen aufrufe, nimmt es nur eine Datei in einem Verzeichnis auf:
testscript *.txt
Aber wenn ich es mit Anführungszeichen aufrufe, funktioniert es korrekt und wählt alle Textdateien aus:
testscript '*.txt'
Was geht hier vor sich?
bash
shell-script
gornvix
quelle
quelle
for a in "$@"; do
(oderfor a; do
) in Ihrem Skript, so dass das Globbing der äußeren Shell überlassen wird, und nicht die Anführungszeichen.Antworten:
Wenn Sie ein Programm aufrufen
Dann führt Ihre Shell die Erweiterung durch und berechnet alle Werte. So könnte es sein, dass Sie Ihr Programm effektiv als aufrufen
Jetzt sieht dein Programm nur noch an
$1
und funktioniert so nur noch weiterfile1.txt
.Indem Sie in der Befehlszeile Anführungszeichen setzen, übergeben Sie die Literalzeichenfolge
*.txt
an das Skript, und das ist, was in gespeichert ist$1
. Ihrefor
Schleife erweitert es dann.Normalerweise würden Sie
"$@"
und nicht$1
in solchen Skripten verwenden.Dies ist ein "gotcha" für Benutzer, die mit CMD-Skripten arbeiten, bei denen die Befehlsshell kein Globbing ausführt (wie es bekannt ist) und immer die Literalzeichenfolge übergibt.
quelle
"$@"
(im Gegensatz zu$@
oder$1
$2
$3
) wird jeder Dateinamen verursachen zitiert werden"file1.txt"
"file2.txt"
usw. Fürfile1.txt
diese sinnlos ist, aber wenn Sie habenmy file.txt
, ist die zitierte kritische um die Schale zu verhindern Parsing, um es in zwei Dateinamen zu verwandeln, einen mit dem Namenmy
und einen mit dem Namenfile.txt
. Geben Sie immer Benutzereingaben und globale Erweiterungen an, damit Sie eines Tages nicht sehr unglücklich sind.Ohne Anführungszeichen wird die Shell
*.txt
vor dem Aufrufen des Skripts erweitert, sodass$1
nur die erste Datei erweitert wird. Alletxt
Dateien sind zu diesem Zeitpunkt Argumente für Ihr Skript (sofern nicht zu viele vorhanden sind).Bei Anführungszeichen wird diese Zeichenfolge übergeben, ohne dass sie in das Skript eingebunden wird.
for
Dadurch kann die Erweiterung erfolgen, wie Sie es sich erhofft haben.quelle