2015-06-10 2 views

ответ

3

В BASH вы можете сделать:

declare -A animals=() 
animals+=([horse]=) 

[[ "${animals[horse]+foobar}" ]] && echo "horse exists" 

"${animals[horse]+foobar}" возвращает foobar если horse является допустимым индексом в массиве иначе он ничего не возвращает.

+0

К сожалению, ... что это значит '=' в конце строки «животных + = ([лошадь] =)» – sensorario

+0

Это присвоение пустого значения индекса 'horse'. 'animals + = ([horse])' даст синтаксическую ошибку в противном случае. – anubhava

8

Есть несколько опечаток в вашем скрипте

Когда я запускаю его, как это, я получаю следующие сообщения об ошибках от BASH:

1. animals: [horse]: must use subscript when assigning associative array 
2. [: missing `]' 

Первый говорит, что если вы хотите использовать horse как индекс для ассоциативного массива, вам нужно присвоить ему значение. Пустое значение (null) - это нормально.

-animals+=([horse]) 
+animals+=([horse]=) 

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

-if [ -z "$animals[horse]"]; then 
+if [ -z "$animals[horse]" ]; then 

Наконец, элемент в ассоциативном массиве существует, когда есть назначенное ему значение (даже если это значение равно null). Поскольку вопрос о тестировании, если значение массива устанавливается уже answered on this site, мы можем позаимствовать решение

-if [ -z "$animals[horse]"]; then 
+if [ -n "${animals[horse]+1}" ]; then 

Для Вашего удобства здесь полный сценарий:

declare -A animals=() 
animals+=([horse]=) 

if [ -n "${animals[horse] + 1}" ]; then 
    echo "horse exists"; 
fi 
+4

Гораздо проще написать «animals [horse] =', чем использовать '+ =' – chepner

+0

@chepner достаточно справедливо, если OP не хочет сразу определить несколько элементов. –

9

В bash 4.3 , оператор -v может быть применен к массивам.

declare -A animals 
animals[horse]=neigh 
# Fish are silent 
animals[fish]= 
[[ -v animals[horse] ]] && echo "horse exists" 
[[ -v animals[fish] ]] && echo "fish exists" 
[[ -v animals[unicorn] ]] && echo "unicorn does not exist" 

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

exists() { 
    # If the given key maps to a non-empty string (-n), the 
    # key obviously exists. Otherwise, we need to check if 
    # the special expansion produces an empty string or an 
    # arbitrary non-empty string. 
    [[ -n ${animal[$1]} || -z ${animal[$1]-foo} ]] 
} 

exists horse && echo "horse exists" 
exists fish && echo "fish exists" 
exists unicorn || echo "unicorn does not exist" 
Смежные вопросы