Вам нужен пробел между «$ non» и], и вам не нужны ():
if [ -z "$var" ] && [ -z "$non" ]
В awk это довольно просто.
awk 'BEGIN{for(v in ENVIRON) print v}'
Однако имейте в виду, что некоторые реализации awk добавляют собственные переменные окружения (, например. GNU awk добавляет AWKPATH
и AWKLIBPATH
к ENVIRON
).
Вывод будет неоднозначным, если имя переменной окружения содержит новую строку, что крайне необычно, но технически возможно. Чистое решение sh было бы трудным. Лучше всего начать с export -p
, но массировать его в чистом виде сложно. Вы можете использовать sed для обработки вывода export -p
, а затем использовать eval
, чтобы заставить оболочку удалить то, что она процитировала. Bash и zsh печатают нестандартные префиксы -.
report () { echo "${1%%=*}"; };
eval "$(export -p | sed "s/^export /report /;
s/^declare -x /report /;
s/typeset -x /report /")"
Обратите внимание, что в зависимости от оболочки export -p
может отображать или не отображать переменные, имена которых недействительны в оболочке, и если это не так, то имена могут быть заключены в кавычки, а могут и нет. Например, dash, mksh и zsh пропускают переменные, имя которых включает новую строку, тире BusyBox и ksh93 печатают их в необработанном виде, а bash печатает их в необработанном виде без их значения. Если вам нужно защититься от ненадежного ввода,не полагайтесь на чистое решение POSIX и определенно не вызывайте eval
для чего-либо, полученного из вывода export -p
.
Я люблю простые вещи; это будет работать для систем POSIX:
printenv | sed 's;=.*;;' | sort
HOME
HOSTNAME
PATH
PWD
SHLVL
TERM
Вот мое решение, которое хорошо обрабатывает переменные окружения, имеющие многострочные -значения:
env -0 | cut -z -f1 -d= | tr '\0' '\n' | sort | column
Это напечатает среду, используя NUL для разделения переменных вместо новой строки (env -0
).
Затем мы удаляем значения переменной с помощью cut -z -f1 -d=
, где опция -z
указывает NUL -записей с разделителями, -f1
— первое поле, а -d=
говорит, что поля ограниченный =
.
tr '\0' '\n'
преобразует разделители NUL в новые строки.
Затем мне нравится сортировать имена переменных и отображать их в столбцах.