Массивы в 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?

  • Автозаполнение zsh для символических ссылок
  • Показать старые или более старые элементы истории с помощью команды history в zsh
  • Внедрить десериализацию значения ключа или что-то подобное
  • Что делает карет в zsh?
  • Ищете удобный способ создания «постоянного массива»,
  • ZSH для автоматического заполнения каталогов в аргументах командной строки?
  • Можно ли в реальном времени заменить текст в оболочке?
  • Как сделать поведение истории о-мой-zsh похожим на Bash's?
  • 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 . Добавление # дает счет.

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