В настоящее время я пишу структуру тестирования bash, где в тестовой функции могут использоваться как стандартные тесты bash ( [[
), так и предопределенные сопоставители. Сопоставители являются оболочками для '[[' и помимо возврата кода возврата, устанавливают какое-то значимое сообщение, говорящее о том, что ожидалось.
Пример:
string_equals() {
if [[ ! $1 = $2 ]]; then
error_message="Expected '$1' to be '$2'."
return 1
fi
}
Итак, когда сопоставление используется, и оно не работает, только тогда устанавливается error_message.
Теперь, в какой-то момент позже, я проверяю, прошли ли тесты успешно. Если это удалось, я печатаю ожидание зеленым, если не удалось - красным.
Кроме того, может быть установлен error_message, поэтому я проверяю, существует ли сообщение, распечатываю его и затем снимаю его (потому что следующий тест может не установить error_message
):
if [[ $error_message ]]; then
printf '%s\n' "$error_message"
unset -v error_message
fi
Теперь мой вопрос: лучше ли отключить переменную или просто установить ее на '', например
error_message=''
Какой лучше? Действительно ли это имеет значение? Или, может быть, мне стоит установить дополнительный флаг, указывающий, что сообщение было установлено?
error_message
с чем, я бы сказал, это не имеет значения. Однако я думаю, что вы хотите[[ $error_message ]]
, иначе вы проверяете, существует ли буквальная строка error_message.Ответы:
Обычно вы не видите разницы, если не используете
set -u
:На самом деле, это зависит от того, как вы собираетесь тестировать переменную.
Я добавлю, что мой предпочтительный способ тестирования, если он установлен:
или
источник
var=
не "не установлено". Это просто пустая строка без кавычек. В дополнение кset -u
различным формам расширения параметров в bash можно также различать значения unset и null:${foo:bar}
расширяется до bar, когдаfoo
не установлено, но "", когдаfoo
имеет значение null, а${foo:-bar}
расширяется до bar, если foo не установлено или равно null.[[ -n $var ]]
ложно, еслиvar
задана пустая строка.${foo-bar}
вместо${foo:bar}
.unset a; echo ">${a:-foo}-${a:foo}-${a-foo}<"
Как уже было сказано, использование unset отличается и от массивов
источник
Таким образом, отключив индекс массива 2, вы по существу удаляете этот элемент в массиве и уменьшаете размер массива (?).
Я сделал свой тест ..
В результате ..
Итак, просто чтобы уточнить, что отключение всего массива фактически полностью удалит его.
источник
Основываясь на комментариях выше, вот простой тест:
Пример:
источник