Если вы готовы ограничить среду выполнения до последней версии Баша (или модифицировать код, чтобы поддерживать эквивалентный синтаксис 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
.
При запуске 'объявить -p ARRAY', вы получите результат, как' объявить -a ARRAY = '([0] = "Баш = да" [1] = "наличные =" [2 ] = "trash = no" [3] = "empty =") '', показывая, что ваши ключи текут tly '0',' 1', '2' и' 3', по сравнению с предположительно заданными значениями 'bash',' cash', 'trash' и' empty'. –