Wenn ich den folgenden Befehl ausführe
./command *
mit diesem Skript
#!/bin/bash
for f in ./$1
do
echo $f
done
nur die erste in $1 angegebene Datei wird wiedergegeben. Meine Frage ist, warum?
Antwort1
Weil Sie beim Ausführen Ihres Befehls keine einfachen oder doppelten Anführungszeichen verwendet haben:
./command '*'
oder:
./command "*"
Oder, wenn Sie auf jeden Fall verwenden möchten ./command *
, nehmen Sie die folgende Änderung in Ihrem Skript vor:
#!/bin/bash
for f in ./"$@"
do
echo $f
done
Das liegt daran, dass $1
sich auf das erste Argument Ihres Befehls bezieht und $@
sich auf alle Argumente Ihres Befehls bezieht.
Lesen Sie in diesem Zusammenhang auch einige Dokumentationen:http://tldp.org/LDP/abs/html/internalvariables.html#APPREF
Antwort2
Die Shell erweitert die, *
wenn Sie den Befehl ausführen. Das Ausführen des Skripts entspricht also
./command file1.txt file2.txt file3.txt
$1
entspricht dem ersten Argument, daher hat die Schleife nur eine Iteration.
Antwort3
$1
bezieht sich nur auf das erste Argument. Sie müssen verwenden $*
.
#!/bin/bash
for f in $*
do
echo $f
done