测试是否设置了多个变量

测试是否设置了多个变量

我想确保在脚本的某个时刻,在source配置文件之后,设置了几个变量,如果没有设置,则停止执行,告诉用户缺少的变量。我努力了

for var in $one $two $three ; do
    ...

但如果 example$two未设置,则永远不会执行循环 for $two。我尝试的下一件事是

for var in one two three ; do
    if [ -n ${!var} ] ; then
        echo "$var is set to ${!var}"
    else
        echo "$var is not set"
    fi
done

但如果没有设置两个,我仍然得到“两个设置为”而不是“两个未设置”。

如何确保设置了所有必需的变量?

更新/解决方案:我知道“设置”和“设置,但空”之间有区别。我现在使用(感谢https://stackoverflow.com/a/16753536/3456281以及这个问题的答案)如下:

if [ -n "${!var:-}" ] ; then

所以,如果var设置了但为空,仍然被认为是无效的。

答案1

引用错误。

if [ -n "${!var}" ] ; then

面向未来:设定

set -x

在运行代码之前就会向您展示问题。您可以使用以下命令调用脚本,而不是将其添加到代码中

bash -vx ./my/script.sh

答案2

如果您希望程序停止:

N= 
${one?var 1 is unset} 
${two:?var 2 is unset or null}
${three:+${N:?var 3 is set and not null}}

这样就可以了。问号后面的每条消息都会打印到stderr和父外壳死了。好吧,所以不是每个message - 只有一个 - 只有第一个失败的打印一条消息,导致 shell 死亡。我喜欢这样使用这些测试:

( for v in "$one" "$two" "$three" ; do
    i=$((i+1)) ; : ${v:?var $i is unset or null...} 
done ) || _handle_it

对此我还有很多话要说这里

答案3

您唯一需要的是测试中的引号:

for var in one two three ; do
    if [ -n "${!var}" ] ; then
        echo "$var is set to ${!var}"
    else
        echo "$var is not set"
    fi
done

对我有用。

答案4

你可以加

set -u

到脚本的开头,使其在尝试使用未设置的变量时终止。

像这样的脚本

#!/bin/sh
set -u
echo $foo

将导致

script.sh: 3: script.sh: foo: 参数未设置

如果您bash改为使用,错误将如下所示:

script.sh:第 3 行:foo:未绑定变量

相关内容