Нет, если в оболочке script?

Я пытался сделать противоположное, если в оболочке делать что-то только, если значение в хеше не существует. Я научился создавать хэш в bash отсюда: Ассоциативные массивы в сценариях оболочки

declare -A myhash

Я объявил простой хеш:

myhash[$key]="1"

и

[ ${myhash[$key]+abc} ]

чтобы узнать, существует или нет myhash [$ key] здесь: Самый простой способ проверить индекс или ключ в массиве?

Я также научился добавлять! перед выражением, чтобы сделать противоположное предложение if: Как сделать "if not true condition" ?

Но следующее выражение

if ! [ ${myhash[$key]+abc} ]; then
 echo $key
fi

не работает, и никакая информация не печатается. Сообщение об ошибке отсутствует.

Я пробовал это:

[ ${myhash[$key]+abc} ] && echo $key

И получил сообщение об ошибке:

abc: command not found

Может ли кто-нибудь сказать мне, как заставить его работать?

3 ответа

Во-первых, это

[ ${myhash[$key]+abc} ]

будет проверять, является ли результат расширения параметра пустым или нет. Либо ${myhash[$key]} существует, либо расширяется до строки (которая сама может быть или не может быть пустой), либо она не расширяется до строки "abc" . Предполагая, что вы не устанавливаете myhash[$key]="", расширение всегда создает непустую строку, и поэтому команда преуспевает. В результате, ! [ ${myhash[$key]+abc} ] всегда терпит неудачу.

Предполагая, что "abc" не является допустимой записью в myhash, вам нужно проверить, будет ли параметр расширяться до фактического значения, или "abc" для отмененных ключей:

if [[ ${myhash[$key]+abc} == abc ]]; then
 echo "$key does not exist in myhash"
else
 echo "myhash[$key]=${myhash[$key]}"
fi


Причина, по которой ничего не печатается, заключается в том, что вы проверяете, не изменилось ли значение после ее установки.

Вот что вы делаете:

#!/bin/bash
key=foo
declare -A myhash # create associative array
myhash[$key]="1" # set the value
if ! [ ${myhash[$key]+abc} ]; then # check if value is not set
 echo $key # if so, print key 
fi

И теперь вы спрашиваете: "Почему не запускается запуск с задержкой при установке значения?"

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

Что касается [ ${myhash[$key]+abc} ] && echo $key, дающего abc: command not found, я не могу это объяснить. Обычно этого не происходит.

Это то, что вы бы увидели, если бы вы сделали ${myhash[$key]+abc} && echo $key. Вы уверены, что правильно представляете фактические примеры, которые вы запускали, и фактические результаты, полученные вами.


Самый простой способ проверить индекс или ключ в массиве? показывает, как проверить, существует ли он с [ ${array[key]+abc} ].

Если это так, команда успешно завершается, поэтому выполняется выполнение команды после && (echo "exists")

Вы хотите проверить, не существует ли он. Таким образом, вы хотите, чтобы ваша команда выполнялась, если часть [..] завершается неудачно. Поэтому используйте || вместо &&:

[ ${myhash[$key]+abc} ] || echo "does not exist"

&&: продолжить с следующей командой только в том случае, если первая выполнена успешно

||: выполнять только следующую команду, если сначала не удалось выполнить

licensed under cc by-sa 3.0 with attribution.