Wie überprüfe ich, ob alle Argumente Dateien sind?

Wie überprüfe ich, ob alle Argumente Dateien sind?

Wie prüft man, ob alle an ein Shell-Skript übergebenen Argumente Dateien sind? Ich habe versucht, den $@Parameter und -fmit einer ifAnweisung zu verwenden.

Antwort1

Um zu testen, oballeArgumente sind Dateien, es ist einfacher zu testen, ob eines der Argumente istnichteine Datei:

for argument do
    if [ ! -f "$argument" ]; then
        printf 'Not a file: %s\n' "$argument" >&2
        exit 1
    fi
done

echo 'All arguments are files'

Dies durchläuft alle Positionsparameter und testet sie nacheinander. Wenn eine Nicht-Datei gefunden wird, wird ein Fehler ausgegeben und der Code wird beendet.

Um alle Argumente zu untersuchen:

for argument do
    if [ -f "$argument" ]; then
        printf 'Is a file: %s\n' "$argument"
    else
        printf 'Is not a file: %s\n' "$argument"
    fi
done

Dies iteriert über alle Positionsparameter, testet jeden nacheinander und druckt das Testergebnis aus.

Beachten Sie, dass „ist eine Datei“Genau genommenbedeutet "ist eine normale Datei oder ein symbolischer Link zu einer normalen Datei". Wenn Sie sicherstellen möchten, dass es sich nicht um einen symbolischen Link zu einer normalen Datei handelt, verwenden Sie

if [ ! -f "$argument" ] || [ -L "$argument" ]; then

als Test in der ersten Schleife oder

if [ -f "$argument" ] && [ ! -L "$argument" ]; then

als Test in der zweiten Schleife.

Die erste Zeile der Schleife könnte auch geschrieben werden

for argument in "$@"; do

... aber die Leute vergessen oft, Anführungszeichen zu setzen $@, und die Schleife oben ist sowieso kürzer einzutippen.

verwandte Informationen