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

z или zt помещает текущую строку в вершину экрана ( == Войдите),

z. или zz помещает текущую строку в центр экрана

z- или zb помещает текущую строку в нижнюю часть экрана

(z, z., и z- помещает курсор в первое не пустой столбец. zt, zz, и zb оставляет курсор в текущем столбце),

Больше информации о прокрутке по http://vimdoc.sourceforge.net/htmldoc/scroll.html или
в типе энергии :help scroll-cursor

2
27.10.2015, 17:59
2 ответа

Я заметил, что 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 предполагает, что опция 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
2
27.01.2020, 21:54

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

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

Флаг (I) subscript в $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. Добавление # дает счетчик.

4
27.01.2020, 21:54

Теги

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