4

У меня есть переменная с именем var, которая хранит список файлов в каталоге. Я перебираю все файлы, и если я нахожу каталог, я выводю "Каталог" на экран. код ниже:

var=$(ls dir)

for file in $var; do
    if [ -d $dir/$file ]; then
        echo "Directory"
    fi
done

У меня есть 2 вопроса:

Во-первых, я делаю это внутри функции и хочу, чтобы переменная $ file оставалась локальной, поэтому, когда моя функция заканчивается, я не получаю к ней доступ. Как я могу установить эту локальную переменную? Я не могу сделать for local file in $var; и я не могу объявить $ file перед циклом.

2-й - Мой цикл не работает, когда $(ls dir) содержит файл с пробелом внутри имени. Например, если $dir имеет 3 файла, файл1, файл 2 и файл3, $var будет содержать только файлы1 и файл3 как реальные файлы, но файл 2 не будет работать, поскольку разделит его на файл и файл 2. Как я могу исправить проблему с файлами, в именах которых есть место?

1 ответ1

3

Для создания $ file local: вы можете использовать local file перед его назначением.

Для файлов с пробелами: не анализируйте ls, используйте подстановочный знак и используйте двойные кавычки вокруг ссылок на переменные:

local file
for file in "$dir"/*; do  # Note that $file will contain $dir as well as the filename
    if [ -d "$file" ]; then
        echo "Directory: $file"
    fi
done

Если вы хотите сохранить имена файлов до начала цикла, используйте массив вместо простой переменной:

local -a filelist
filelist=("$dir"/*)
local file
for file in "${filelist[@]}"; do
    ...

Смотрите BashFAQ # 20: «Как я могу найти и безопасно обрабатывать имена файлов, содержащие переводы строк, пробелы или оба?« Для более сложных примеров и более хитрости.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .