Wie prüft man, ob alle an ein Shell-Skript übergebenen Argumente Dateien sind? Ich habe versucht, den $@
Parameter und -f
mit einer if
Anweisung 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.