Warum funktioniert dieses Bash-Skript nicht?

Warum funktioniert dieses Bash-Skript nicht?

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 $1sich 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

$1entspricht dem ersten Argument, daher hat die Schleife nur eine Iteration.

Antwort3

$1bezieht sich nur auf das erste Argument. Sie müssen verwenden $*.

#!/bin/bash

for f in $*
do
     echo $f
done

verwandte Informationen