对于某些 shell 会话,如果未设置和导出 shell 变量,我希望能够打印警告标志。
如果未设置或为空,则执行类似这样的操作以在提示中打印“错误”非常简单SET_ME
。
test_var () { test -z "$1" && echo Error; }
PS1='$(test_var "$SET_ME") \$ '
但是,如果我设置而不导出它,这将无法标记SET_ME
,这是我希望能够检测到的错误。除了$(bash -c 'test -z "$SET_ME" && echo Error;')
或 grepping 的输出之外export
,是否有一个简单的检查可以让我测试是否SET_ME
已导出?
非 POSIX、仅限 bash 的解决方案是完全可以接受的。
答案1
使用declare
命令和正则表达式匹配运算符:
test_var () {
# $1 - name of a shell variable
var=$1
[[ -z "${!var}" ]] && echo Error
[[ $(declare -p $1) =~ ^declare\ -[aAilrtu]*x[aAilrtu]*\ ]] || echo Error
}
答案2
在Bash 4.4 或更高版本,您可以使用${parameter@a}
shell 参数扩展获取有关参数的属性列表,包括是否导出。
这是一个简单的函数演示${parameter@a}
,它将告诉您给定变量是否被导出,并给出其名称:
function is_exported {
local name="$1"
if [[ "${!name@a}" == *x* ]]; then
echo "Yes - '$name' is exported."
else
echo "No - '$name' is not exported."
fi
}
使用示例:
$ is_exported PATH
Yes - 'PATH' is exported.
$ foo=1 is_exported foo
Yes - 'abc' is exported.
$ bar=1; is_exported bar
No - 'abc' is not exported.
$ export baz=1; is_exported baz
Yes - 'baz' is exported.
$ export -n baz; is_exported baz
No - 'baz' is not exported.
$ declare -x qux=3; is_exported qux
Yes - 'qux' is exported.
怎么运行的:
返回的格式${parameter@a}
是每个属性一个字符,每个属性字符的含义来自声明命令- 在这种情况下,我们要寻找x
- 导出。
答案3
我知道这个问题已经三年了,但人们可能会发现以下解决方案更简单:
[ "$(bash -c 'echo ${variable}')" ]
答案,如果变量被导出并且具有非空值。
答案4
如果我决定使用export
和grep
,最简单的测试可能是这样的。
export | grep -Eq '^declare -x SET_ME='
或者如果我也想要非空:
export | grep -Eq '^declare -x SET_ME=".+"'