我想确保在脚本的某个时刻,在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:未绑定变量