Массивы в Zsh. Проверьте, не определена ли какая-либо из следующих переменных

Скажем, у нас есть набор переменных, которые мы хотим проверить, если они определены, и установить условие, если какое-либо из них не является.

Я подумываю о следующем:

#!/usr/bin/env zsh d=("$VAR1" "$VAR2" "$VAR3") for x in $d; do if <variable_x_not_defined> UNDEFINED_VARIABLES="True" fi done 

Я испытал с различными вариантами условия <variable_x_not_defined> без везения. Я использую массив здесь? Как я могу это сделать в Zsh?

  • При создании среды зависит от текущего каталога
  • `ls \` выходит из сеанса терминала?
  • Экран: «Невозможно выполнить exec / my / path / to / zsh» с локальной оболочкой
  • cd в каталог символически связанного файла
  • Диапазоны массивов с пользовательским размером шага в оболочках Борна
  • PS1 = '$ (pwd)' почему это работает и почему это отличается от PS1 = $ (pwd)
  • Изменение оболочки по умолчанию без привилегий chsh или администратора
  • Трубопроводы, рабочие места и процессы в Zsh
  • 2 Solutions collect form web for “Массивы в Zsh. Проверьте, не определена ли какая-либо из следующих переменных”

    Я замечаю, что for x in $d пропускает пустые строки:

     VAR1=a VAR2= VAR3=c d=("$VAR1" "$VAR2" "$VAR3") for x in $d; do echo $x done a c 

    (обратите внимание на недостающую пустую строку между a и c )

    Используя расширение bash- и ksh-совместимых массивов, "${d[@]}" похоже, делает трюк:

     VAR1=a VAR2= VAR3=c d=("$VAR1" "$VAR2" "$VAR3") for x in "${d[@]}"; do echo $x done a c 

    Таким образом, ваш скрипт мог бы сделать:

     #!/usr/bin/env zsh d=("$VAR1" "$VAR2" "$VAR3") undefined_variables=false for x in "${d[@]}"; do if [[ -z "${x}" ]]; then undefined_variables=true break fi done if $undefined_variables; then echo "Found some undefined variables" fi 

    Также обратите внимание, что for x in $d форме for x in $d предполагается, что параметр KSH_ARRAYS не установлен, что может не всегда быть истинным.


    Альтернативно, вы можете установить массив на имена переменных, а не на значения, а затем использовать «nameref» внутри цикла. Таким образом, цитирование проще, и вы можете видеть, какие переменные были отменены.

     #!/usr/bin/env zsh VAR1=a VAR2=b VAR3= vars=(VAR1 VAR2 VAR3) undefined_variables=false for var in $vars; do # or 'for var in "${vars[@]}"' if KSH_ARRAYS might be on if [[ -z "${(P)var}" ]]; then echo "$var is empty" undefined_variables=true fi # alternatively to test for defined variable as opposed to empty: if ((! ${(P)+var})); then echo "$var is not set" undefined_variables=true fi done 

    Чтобы проверить, содержит ли массив хотя бы один пустой элемент, вы можете:

     if ((i = array[(I)])); then echo "array contains at least one empty element (${i}th)" else echo "array doesn't contain empty elements" fi 

    Флаг индекса $array[(I)pattern] возвращает индекс последнего элемента, который соответствует pattern или 0 если не найден.

    Или вы можете подсчитать количество пустых элементов с помощью:

     if ((n = ${(M)#array[@]:#})); then echo "array contains $n empty elements" else echo "array doesn't contain any empty element" fi 

    ${(M)array[@]:#pattern} расширяется до элементов, соответствующих pattern . Добавление # дает счет.

    Interesting Posts

    Сценарий оболочки для резервного копирования VMware VM, экспорт каждой виртуальной машины в список, а затем запрос пользователя на ввод

    BRMS Ошибка при импорте repo.xml на другом узле

    Список файлов в каталоге с определенным расширением

    В терминале терминологии, как мне изменить его оболочку входа?

    Почему RHEL предлагает обновления для оборудования, которого у меня нет?

    Как решить эту ошибку ядра при запуске ОС?

    Диапазонные переменные для настраиваемых пользователем циклов

    Как удалить предустановленные гостевые дополнения VirtualBox из Linux Mint 18?

    Как я могу узнать операционную систему моего сервера?

    Найти каталог, содержащий все файлы в моем списке

    Приложение WSGI, «AH01630: клиент отказался от конфигурации сервера», но клиент все равно получает страницу

    В Vim, как я могу копировать несколько строк? (не диапазон);

    можно ли настроить сортировку по умолчанию списка файлов в диалоговом окне «Открыть файл» gnome?

    Всякий раз, когда ansible вносит изменения в sshd в CentOS7, случайная игра в будущее не может подключаться

    Загрузка в VNCViewer на малине Pi.

    Linux и Unix - лучшая ОС в мире.