检查环境变量是否已设置

Lol*_*lly 37 unix linux shell

我正在写一个shell脚本,我必须检查是否设置了环境变量,如果没有设置,那么我必须设置它.有没有办法检查shell脚本,是否已经设置了环境变量?

Wil*_*ell 57

有条件地分配变量(无论是否在环境中)的标准解决方案是:

: ${VAR=foo}
Run Code Online (Sandbox Code Playgroud)

只有在未设置的情况下,才会将VAR设置为值"foo".
要将VAR设置为"foo"(如果未设置VAR或空字符串),请使用:

: ${VAR:=foo}
Run Code Online (Sandbox Code Playgroud)

要将VAR置于环境中,请按照以下步骤操作:

export VAR
Run Code Online (Sandbox Code Playgroud)

你也可以做export VAR=${VAR-foo}export VAR=${VAR:=foo},但一些旧炮弹不支持分配和出口的语法在同一直线上.还有,DRY ; 使用=操作员两侧的名称是不必要的重复.(导出变量的第二行违反了相同的原则,但感觉更好.)

请注意,通常很难确定变量是否在环境中.解析输出env将无效.考虑:

export foo='
VAR=var-value'
env | grep VAR
Run Code Online (Sandbox Code Playgroud)

也不能产生子壳和测试:

sh -c 'echo $VAR'
Run Code Online (Sandbox Code Playgroud)

这将表明VAR在子shell中设置,这将是VAR在当前进程的环境中的指示符,但可能只是在子shell的初始化中设置VAR.但是,在功能上,结果与VAR在环境中的结果相同.幸运的是,您通常不关心VAR是否在环境中.如果你需要它,把它放在那里.如果你需要它,把它拿出来.

  • 我在[StackOverflow](http://stackoverflow.com/questions/4437573/bash-assign-default-value)上找到了一些解释! (2认同)

Igo*_*bin 28

[ -z "$VARIABLE" ] && VARIABLE="abc"

if env | grep -q ^VARIABLE=
then
  echo env variable is already exported
else
  echo env variable was not exported, but now it is
  export VARIABLE
fi
Run Code Online (Sandbox Code Playgroud)

我想强调这[ -z $VARIABLE ]还不够,因为你可以拥有,VARIABLE但它没有被导出.这意味着它根本不是环境变量.


Ben*_*y13 17

你想要做的是bash中的native,它被称为参数替换:

VARIABLE="${VARIABLE:=abc}"
Run Code Online (Sandbox Code Playgroud)

如果未设置VARIABLE,则右侧将等于abc.请注意,如果未设置VARIABLE或为空,:=则可以使用:-哪些测试替换内部运算符.


unu*_*tbu 9

if [ -z "$VARIABLE" ]; then
    VARIABLE=...
fi
Run Code Online (Sandbox Code Playgroud)

这将检查$ VARIABLE的长度是否为零.