检查 shell 变量是否被导出的最简单的脚本方法是什么?

检查 shell 变量是否被导出的最简单的脚本方法是什么?

对于某些 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

如果我决定使用exportgrep,最简单的测试可能是这样的。

export | grep -Eq '^declare -x SET_ME='

或者如果我也想要非空:

export | grep -Eq '^declare -x SET_ME=".+"'

相关内容