Как проверить, все ли аргументы являются файлами?

Как проверить, все ли аргументы являются файлами?

Как проверить, все ли аргументы, переданные в скрипт оболочки, являются файлами? Я пробовал использовать $@параметр и -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

... но люди склонны забывать о двойных кавычках $@, а цикл вверху в любом случае короче для набора.

Связанный контент