Как проверить, все ли аргументы, переданные в скрипт оболочки, являются файлами? Я пробовал использовать $@
параметр и -f
с if
оператором.
решение1
Чтобы проверить,всеаргументы являются файлами, проще проверить, является ли один из аргументовнетфайл:
for argument do
if [ ! -f "$argument" ]; then
printf 'Not a file: %s\n' "$argument" >&2
exit 1
fi
done
echo 'All arguments are files'
Это перебирает все позиционные параметры и проверяет каждый из них по очереди. Если найден не файл, выводится ошибка и код завершается.
Чтобы исследовать все аргументы:
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
Это позволяет перебрать все позиционные параметры и проверить каждый из них по очереди, выведя результат проверки.
Обратите внимание, что «это файл»на самом делеозначает "это обычный файл или символическая ссылка на обычный файл". Если вы хотите убедиться, что это не символическая ссылка на обычный файл, используйте
if [ ! -f "$argument" ] || [ -L "$argument" ]; then
как тест в первом цикле, или
if [ -f "$argument" ] && [ ! -L "$argument" ]; then
как тест во втором цикле.
Первую строку цикла можно также записать
for argument in "$@"; do
... но люди склонны забывать о двойных кавычках $@
, а цикл вверху в любом случае короче для набора.