我使用的是 LinuxMint(也尝试过 CentOS),并且一直在尝试使用 printenv 命令来设置可能存在或不存在的环境变量。所以我希望它打印该名称的值(如果存在),否则不打印任何内容,但返回退出代码 0。
但是,如果我使用不存在的环境名称调用它,它将退出并显示错误代码 1。 printenv 的手册页或帮助没有说明此行为。
这是我尝试的方法:
> /usr/bin/printenv foo
那只是返回,然后我这样做:
> echo $?
返回:
1
printenv 的版本是:
printenv (GNU coreutils) 8.25
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by David MacKenzie and Richard Mlynarik.
有没有人有其他方法来实现我所追求的目标?最终,我只需要设置一个 bash 变量来包含环境变量的值(如果该环境变量存在),否则将该 bash 变量清空:
mybashv=`printenv foo`
答案1
printenv 的信息文档说明了有关退出代码的以下内容:
0 if all variables specified were found
1 if at least one specified variable was not found
2 if a write error occurred
这看起来与您观察到的一致。
如果我理解正确的话,你想隐藏这个状态代码。对于任何命令,这可以通过附加 来实现|| true
,例如:
$ var=`printenv foo || true`
$ echo $?
0
答案2
当无法打印环境变量的内容时返回非零退出状态(失败)听起来对我来说是正确的事情。这tcsh
与同名内置函数和 BSD 上的历史实现的行为相匹配。
如果不这样做,将很难区分设置为空值的变量和未设置的变量。
set -e
如果您想避免/的影响set -o errexit
,请使用:
var=$(printenv VAR) || : Do not care if it fails
或者:
if var=$(printenv VAR); then
if [ -z "$var" ]; then
echo "VAR is set but empty or consists only of newline characters"
else
echo "VAR is set and non-empty"
fi
else
echo "VAR is not in the environment"
fi
另请注意,所有 shell 都会从相应的环境变量中初始化 shell 变量(对于那些可以映射到 shell 变量的变量,有些 shell 会删除不能映射到的变量),因此您也可以$VAR
在脚本中使用它们来引用它们的值(但请注意,在 Bourne、csh 或 tcsh shell(人们可能仍想使用`...`
您的 shell 的唯一 shell)中,如果您修改 shell 变量而不导出它(或分配它与setenv
for (t)csh)) 一起使用。