В вашем скрипте есть несколько ошибок, например вы не должны давать итератору цикла то же имя, что и сам массив. Однако вам не нужен цикл для этой задачи, просто поместите все элементы массива сразу со специальным индексом массива @
:
value=(Choice1 "" Choice2 "" Choice3 "" Choice4 "")
whiptail --title "xx" --menu "choose" 16 78 10 "${value[@]}"
Обратите внимание на пустую строку внутри кавычек ""
- это описание требуется для параметра меню whiptail
, без этого вы бы рассматривали Выбор
и Выбор4
как описание:
Choice1 Choice2
Choice3 Choice4
что, вероятно, не то, что вам нужно.
Вы не получаете предупреждения в 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 '* ...
вместо этого.
Прихватить (N)
к выкройке; это говорит zsh не расстраиваться из-за отсутствия соответствия.
rm -f *.{dot,svg,err}(N)
Это глобальная функция zsh
. См. man zshexpn
для получения более подробной информации; в разделе «Отборочные турниры Glob». Он аннотируется как «устанавливает параметр NULL_GLOB для текущего шаблона».