IT_*_*ser 12 shell bash shell-script
我正在学习如何set在我的脚本中有效地使用不同的选项,并发现set -u如果变量设置不正确(例如删除用户),这似乎非常适合退出我的脚本。根据手册页,set -u并set -e执行以下操作...
-e Exit immediately if a command exits with a non-zero status.
-u Treat unset variables as an error when substituting.
Run Code Online (Sandbox Code Playgroud)
我创建了一个测试脚本来测试此功能,但它似乎没有按预期工作。也许有人可以更好地向我解释我的问题以及我误解的地方?测试脚本如下。谢谢你。
set -e
set -u
testing="This works"
echo $?
echo ${testing}
testing2=
echo $?
echo ${testing2}
testing3="This should not appear"
echo $?
echo ${testing3}
Run Code Online (Sandbox Code Playgroud)
我希望脚本显示0和"This works",然后由于${testing2}未设置而失败。
相反,我显示0和"This works",然后是0然后是0 这不应该出现
有人可以提供一些知识吗?谢谢你。
小智 10
来自“man Bash”:
如果一个参数已被赋值,则该参数被设置。空字符串是有效值。一旦设置了变量,只能使用 unset 内置命令取消设置。
当您这样做时,testing2=您将变量设置为空字符串。
将其更改为unset testing2并重试。
在set -e这种情况下不利于作为赋值从来没有为1的退出代码试试这个一看就知道最后一个命令执行过程中(分配)为0的退出代码,或阅读了这个问题:
$ false; a=""; echo $?
0
Run Code Online (Sandbox Code Playgroud)
而且我也相信使用 set -e 更像是一个问题而不是解决方案。
使用未设置的变量可能会出错的是set -u:
#!/bin/bash
set -u
testing="This works"
echo ${testing}
unset testing2
echo ${testing2}
testing3="This should not appear"
echo ${testing3}
Run Code Online (Sandbox Code Playgroud)
将输出:
$ ./script.sh
This works
./script.sh: line 9: testing2: unbound variable
Run Code Online (Sandbox Code Playgroud)