Разница между незанятыми и пустыми переменными в bash

Используя bash, какой лучший метод проверить, пуста или нет переменная?

Если я использую:

if [ -z "$VAR" ]

как было предложено в форуме, это работает для unset-переменной, но это верно, когда переменная установлена, но пустой. Предложения?

Ответ 1

if [ `set | grep '^VAR=$'` ]

Это ищет строку "VAR =" в списке заданных переменных.

Ответ 2

${var+set} ничего не заменяет, если переменная не установлена ​​и set, если она установлена ​​на что угодно, включая пустую строку. ${var:+set} заменяет set только в том случае, если для переменной задана непустая строка. Вы можете использовать это для тестирования для любого случая:

if [ "${foo+set}" = set ]; then
    # set, but may be empty
fi

if [ "${foo:+set}" = set ]; then
    # set and nonempty
fi

if [ "${foo-unset}" = unset ]; then
    # foo not set or foo contains the actual string 'unset'
    # to avoid a potential false condition in the latter case,
    # use [ "${foo+set}" != set ] instead
fi

if [ "${foo:-unset}" = unset ]; then
    # foo not set or foo empty or foo contains the actual string 'unset'
fi

Ответ 3

Вы можете протестировать с помощью

[ -v name ]

имя без знака $

Ответ 4

ну, вот один из способов

$ s=""
$ declare -p s
declare -- s=""
$ unset s
$ declare -p s
bash: declare: s: not found

появится сообщение об ошибке, если переменная не установлена.

Ответ 5

Это будет верно только для пустых, а не для неустановленных (или имеет значение)

[ -z ${VAR-X}