美文网首页
Shell_08_set用法

Shell_08_set用法

作者: 热爱_生活 | 来源:发表于2019-12-22 09:44 被阅读0次

set -u

当脚本中遇到未定义的变量时,默认是忽略。

有时候这并不是开发者想要的。

假如有未定义的变量,应该报错,并且终止脚本继续运行。

set -u 就可以办到

示例

#!/usr/bin/env bash
set -u

echo $a
echo shark

执行报如下错误

$ bash set.sh
set.sh: line 13: a: unbound variable

分析

image

注意

set -u

a=`ls |grep 'asfdasdf'`
echo "|$a|"

# -u  只针对未定义的变量有效
# 这种情况,变量的值会是一个空字符串
# 所以脚本会继续执行

set -e

set -e 的作用就是:
在脚本执行中,有任何命令的返回值是非 0 的情况,则正在运行的脚本则会退出。

设置 -e 之前

[root@kube-master set]# cat set-e-before.sh
#!/bin/sh

foo
echo "继续执行"

执行结果

[root@kube-master set]# sh set-e-before.sh
set-e-before.sh: line 3: foo: command not found
继续执行

设置 -e 之后

解决办法是在脚本中设置 set -e

[root@kube-master set]# cat set-e-after.sh
#!/bin/sh

set -e

foo
echo "继续执行"

执行结果

[root@kube-master set]# sh set-e-after.sh
set-e-after.sh: line 5: foo: command not found

但是,对于一组含有管道的命令无效,比如:

#!/usr/bin/env bash
set -e
foo | echo "shark"    # 注意这里有管道符
echo  "程序会继续运行"

执行结果

[root@kube-master set]# sh set-e.sh
shark
set-e.sh: line 2: foo: command not found   # 这是报错信息
程序会继续运行

foo 不是 shell 中的命令,执行会报错,但是其后面有个管道,最终管道后的 echo 命令执行成功了,这种情况下 脚本会继续执行。

解决办法是使用下面的 set -o pipefail

set -o pipefail

需要和 set -e 配合使用。
如果设置,如果管道中的所有命令都成功退出,整条命令的返回值才是 0。否则返回非 0
默认情况下禁用此选项

示例脚本内容

# 设置 set -o pipefail 后,此时脚本就会终止运行
set -e
set -o pipefail
foo |echo ''
echo shark

执行效果

[root@kube-master set]# sh set-e-pipefail.sh

set-e-pipefail.sh: line 4: foo: command not found

相关文章

网友评论

      本文标题:Shell_08_set用法

      本文链接:https://www.haomeiwen.com/subject/wjxonctx.html