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

CB *_*ley 23 bash environment-variables

对于某些 shell 会话,如果未设置和导出 shell 变量,我希望能够打印警告标志。

如果SET_ME未设置或为空,则执行类似操作以在提示中打印“错误”相当简单。

test_var () { test -z "$1" && echo Error; }
PS1='$(test_var "$SET_ME") \$ '
Run Code Online (Sandbox Code Playgroud)

但是,如果我设置SET_ME而不导出它,则无法标记,这是我希望能够检测到的错误。$(bash -c 'test -z "$SET_ME" && echo Error;')缺少类似或 grepping 的输出export,是否有一个简单的检查可以测试是否SET_ME已导出?

完全可以接受非 POSIX、仅 bash 的解决方案。

che*_*ner 12

使用declare命令和正则表达式匹配运算符:

test_var () {
    # $1 - name of a shell variable
    var=$1
    [[ -z "${!var}" ]] && echo Error
    [[ $(declare -p $1)  =~ ^declare\ -[aAilrtu]*x[aAilrtu]*\  ]] || echo Error
}
Run Code Online (Sandbox Code Playgroud)


小智 5

我知道这个问题已经有 3 年历史了,但是人们可能会发现以下解决方案更简单:

[ "$(bash -c 'echo ${variable}')" ]
Run Code Online (Sandbox Code Playgroud)

答案,如果变量被导出并且具有非空值。


Rob*_*cke 5

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
}
Run Code Online (Sandbox Code Playgroud)

使用示例:

$ 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.
Run Code Online (Sandbox Code Playgroud)

这个怎么运作:

返回的格式${parameter@a}是每个属性一个字符,每个属性字符的含义来自声明命令的相应选项- 在这种情况下,我们要查找x- 导出。


Dev*_*lar 1

export命令不带参数给出当前环境中导出的名称列表:

$ FOO1=test
$ FOO2=test
$ export | grep FOO
$ export FOO2
$ export | grep FOO
declare -x FOO2="test"
Run Code Online (Sandbox Code Playgroud)

一些切割和播种可以去除绒毛:

export | cut -d' ' -f 3- | sed s/=.*//
Run Code Online (Sandbox Code Playgroud)

这是您的出口清单,可供进一步处理。