2016-10-03 2 views
1

Я хочу сценарий bash/sh/ksh , который сравнивает множество переменных , возможно, в массиве, и скажите, если переменная пуста или нет. Я думаю, что-то вроде этого ... но не работает.Как проверить, являются ли значения массива пустыми?

ARRAY=(
bash="yes" 
cash="" 
trash="no" 
empty="" 
) 

for var in "${ARRAY[@]}"; do 
if [ "$var" == "$empty" ] 
then 
echo "$var is empty" 
else 
echo "$var is not empty" 
fi 
done 

Я хочу, чтобы выход как этого

bash is not empty 
cash is empty... 
+0

При запуске 'объявить -p ARRAY', вы получите результат, как' объявить -a ARRAY = '([0] = "Баш = да" [1] = "наличные =" [2 ] = "trash = no" [3] = "empty =") '', показывая, что ваши ключи текут tly '0',' 1', '2' и' 3', по сравнению с предположительно заданными значениями 'bash',' cash', 'trash' и' empty'. –

ответ

2

Если вы готовы ограничить среду выполнения до последней версии Баша (или модифицировать код, чтобы поддерживать эквивалентный синтаксис ksh93 в),

#!/bin/bash 
#  ^^^^ -- specifically, bash 4.0 or newer 

declare -A array # associative arrays need to be declared! 
array=([bash]="yes" [cash]="" [trash]="no" [empty]="") 

for idx in "${!array[@]}"; do 
    if [[ ${array[$idx]} ]]; then 
    echo "$idx is not empty" 
    else 
    echo "$idx is empty" 
    fi 
done 

перебрать ключи в массиве, в отличие от значений, синтаксис "${!array[@]}", в отличие от "${array[@]}"; если вы просто перебираете значения, вы не знаете имя текущего оцениваемого.

В качестве альтернативы предположим, что мы не собираемся использовать массив; другой способ установить пространство имен для переменных, которые вы собираетесь быть в состоянии лечить подобным образом, является предваряя их:

#!/bin/bash 

val_bash=yes 
val_cash= 
val_trash=no 
val_empty= 

for var in "${[email protected]}"; do 
    if [[ ${!var} ]]; then 
    echo "${var#val_} is not empty" 
    else 
    echo "${var#val_} is empty" 
    fi 
done 

Это работает (на баш 3.x, а), потому что "${[email protected]}" расширяется список переменных имена, начинающиеся с prefix, и "${!varname}" расширяются до содержимого переменной, имя которой само хранится в переменной varname.

+0

Возможно, вы должны включить строку shebang, поскольку в вопросе упоминается «bash/sh/ksh». – choroba

+0

@choroba, хороший звонок, с поправками. –

1

Итерация по элементам массива, и внутри цикла для read установить IFS в =, чтобы получить переменную и ее значение в двух отдельных переменных, а затем проверить, если значение пусто:

for i in "${array[@]}"; do 
    IFS== read var value <<<"$i" 
    if [ -z "$value" ]; then 
     echo "$var is empty" 
    else 
     echo "$var is not empty" 
    fi 
done 

Выходы:

bash is not empty 
cash is empty 
trash is not empty 
empty is empty 
+0

Если структура данных OP действительно неизлечима и предназначена именно для этого, то это, безусловно, правильно. Я не уверен, что это так, но они говорят о готовности принять любое решение sh/ksh/bash, так что, безусловно, они гибки в синтаксисе. Если цель состоит в том, чтобы выбрать синтаксис, который является правильным инструментом для задания, то я бы утвердил, что ассоциативный массив является единственным разумным выбором: кто хочет, чтобы итерации через численный индексный массив, чтобы найти переменную, которую они хотят? –

+0

@CharlesDuffy I второй. Здесь ассоциативный массив - это структура данных _right_. – heemayl

Смежные вопросы