Есть ли у ash эквивалент опции 'nullglob' в bash? - PullRequest
4 голосов
/ 29 января 2011

Если шаблон glob не соответствует ни одному файлу, bash просто вернет буквальный шаблон:

bash-4.1# echo nonexistent-file-*
nonexistent-file-*
bash-4.1#

Вы можете изменить поведение по умолчанию, установив параметр оболочки nullglob, чтобы, если ничего не найдено, вы получили пустую строку:

bash-4.1# shopt -s nullglob
bash-4.1# echo nonexistent-file-*

bash-4.1# 

Так есть ли эквивалентная опция в ash?

bash-4.1# ash
~ # echo nonexistent-file-*
nonexistent-file-*
~ # shopt -s nullglob
ash: shopt: not found
~ # 

Ответы [ 2 ]

3 голосов
/ 20 января 2017

Этот метод более производительный, чем проверка существования на каждой итерации:

set q-*
[ -e "$1" ] || shift
for z; do echo "$z"
done

Мы используем set, чтобы развернуть подстановочный знак в списке аргументов оболочки. Если первый элемент списка аргументов не является допустимым файлом, глобус ничего не соответствует. (В отличие от некоторых часто встречающихся попыток, это работает правильно, даже если первое совпадение с глобаном было в файле, имя которого совпадает с шаблоном глобуса.)

В случае несоответствия, список аргументов содержит один элемент, и мы смещаем его, так что список аргументов теперь пуст. Тогда цикл for вообще не будет выполнять никаких итераций.

В противном случае мы перебираем список аргументов, в которые расширился глоб (это неявное поведение, когда нет in elements после for variable).

3 голосов
/ 30 января 2011

Для оболочек без nullglob, таких как пепел и тире:

IFS="`printf '\n\t'`"   # Remove 'space', so filenames with spaces work well.

# Correct glob use: always use "for" loop, prefix glob, check for existence:
for file in ./* ; do        # Use "./*", NEVER bare "*"
    if [ -e "$file" ] ; then  # Make sure it isn't an empty match
        COMMAND ... "$file" ...
    fi
done

Источник: Имена файлов и путей в оболочке: Как это сделать правильно ( кэшировано )

...