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)
答案,如果变量被导出并且具有非空值。
在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- 导出。
该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)
这是您的出口清单,可供进一步处理。
| 归档时间: |
|
| 查看次数: |
5538 次 |
| 最近记录: |