сопоставление файлов с помощью расширения фигурных скобок в zsh

В вашем скрипте есть несколько ошибок, например вы не должны давать итератору цикла то же имя, что и сам массив. Однако вам не нужен цикл для этой задачи, просто поместите все элементы массива сразу со специальным индексом массива @ :

value=(Choice1 "" Choice2 "" Choice3 "" Choice4 "")
whiptail --title "xx" --menu "choose" 16 78 10 "${value[@]}"

Обратите внимание на пустую строку внутри кавычек "" - это описание требуется для параметра меню whiptail , без этого вы бы рассматривали Выбор и Выбор4 как описание:

Choice1 Choice2
Choice3 Choice4

что, вероятно, не то, что вам нужно.

5
28.07.2016, 00:53
2 ответа

Вы не получаете предупреждения в bash , вы получаете ошибку от ls (вы обнаружите, что ls статус выхода отличен от 0, что указывает на сбой).

В обоих zsh и bash , {...} не является оператором подстановки, это расширение, которое происходит перед подстановкой.

В:

ls -d -- *.{dot,svg,err}

(вы забыли -d и - btw) оболочка сначала расширяет {...} :

ls -d -- *.dot *.svg *.err

, а затем делает глобус. bash , как и большинство Bourne-подобных оболочек, имеет тот недостаток, что несовпадающие глобусы передаются как есть. В zsh несоответствующий глобус является ошибкой.

Посмотрите, как rm -f [ab] .c в bash может удалить файл [ab] .c , если не было файла с именем ] ac и bc . В zsh вместо этого вы получите ошибку нет соответствия . См. Параметр failglob в bash , чтобы получить аналогичное поведение.

ls -d -- *.{dot,svg,err}(N)

в zsh включит параметр nullglob для всех трех глобусов, так что если глобусы не совпадают, они удаляются, но это, вероятно, не то, что вы хотите, потому что если ни один из глобусов не соответствует ни одному файлу, команда будет иметь вид:

ls -d --

Что выведет список . (текущий каталог) вместо этого.

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

ls -d -- *.(dot|svg|err)

Это даст отсортированный список файлов для ls , ls будет запущен, если не будет найден файл, соответствующий этому шаблону.

У вас также есть возможность включить поведение sh / bash (фиктивный IMO) с помощью emulate sh или unsetopt nomatch . Немного лучший подход - включить поведение csh (которое также было поведением оболочек Unix до выпуска оболочки Bourne):

setopt cshnullglob

С этой опцией команда отменяется, только если all глобусы в командной строке не совпадают. Если хотя бы одно совпадение, все несоответствующие удаляются, поэтому:

ls -d -- *.{dot,svg,err}

По очереди расширяет точку , svg и err , пропуская недостающие.

Если вы хотите сравнить влияние различных подходов на порядок аргументов, вам понадобится команда, которая (в отличие от ls ) не сортирует их перед отображением. В GNU ls вы можете передать для этого параметр -U , или, поскольку ls выводит здесь только свои аргументы, просто используйте printf '% s \ n '* ... вместо этого.

13
27.01.2020, 20:33

Прихватить (N) к выкройке; это говорит zsh не расстраиваться из-за отсутствия соответствия.

rm -f *.{dot,svg,err}(N)

Это глобальная функция zsh . См. man zshexpn для получения более подробной информации; в разделе «Отборочные турниры Glob». Он аннотируется как «устанавливает параметр NULL_GLOB для текущего шаблона».

4
27.01.2020, 20:33

Теги

Похожие вопросы