默认情况下,shell脚本的执行成功与否,取决于该脚本中最后一行命令的执行成功与否,换句话说,即使该脚本前n行命令都执行失败了,只要最后一行命令执行成功,系统就认为该脚本执行成功. 体现在linux上,即显示$?=0, 体现在ds工作流上,即显示成功并执行后续任务.
脚本内容:
[root@ds-master ~]# cat a.sh
#!/bin/bash
echo 1
abcd
echo 2
执行情况:
[root@ds-master ~]# bash ./a.sh
1
./a.sh: line 3: abcd: command not found
2
返回参数:
[root@ds-master ~]# $?
0
set -e : 后续代码出错,报错并终止执行
脚本内容:
[root@ds-master ~]# cat a.sh
#!/bin/bash
echo 1
set -e
abcd
echo 2
执行情况:
[root@ds-master ~]# bash ./a.sh
1
./a.sh: line 4: abcd: command not found
set +e : 后续代码出错,报错但继续执行
脚本内容:
[root@ds-master ~]# cat a.sh
#!/bin/bash
echo 1
set +e
abcd
echo 2
set -e
abcd
echo 3
执行情况:
[root@ds-master ~]# bash ./a.sh
1
./a.sh: line 4: abcd: command not found
2
./a.sh: line 7: abcd: command not found
set -u : 检查变量是否有值,无值则报错并终止执行
通常在rm -rf中使用,尤其是rm -rf 变量/*
脚本内容:
[root@ds-master ~]# cat ./a.sh
#!/bin/bash
echo 1
set -u
echo $a
echo 2
执行情况:
[root@ds-master ~]# bash ./a.sh
1
./a.sh: line 4: a: unbound variable
set -o pipefail: 有管道符的脚本(先执行|后的命令,再执行|前的命令),与set -e的统一性
有set -e,但无set -o pipefail
报错在管道符前: 先执行|后的命令,再执行|前的命令,报错,但继续执行
脚本内容:
[root@ds-master ~]# cat ./a.sh
#!/bin/bash
echo 1
set -e
abcd | echo 2
echo 3
执行情况:
[root@ds-master ~]# bash ./a.sh
1
2
./a.sh: line 4: abcd: command not found
3
报错在管道符后: 先执行|后的命令,报错并终止执行
脚本内容:
[root@ds-master ~]# cat ./a.sh
#!/bin/bash
echo 1
set -e
echo 2 | abcd
echo 3
执行情况:
[root@ds-master ~]# bash ./a.sh
1
./a.sh: line 4: abcd: command not found
有set -e, 且有set -o pipefail
报错在管道符前: 先执行|后的命令,再执行|前的命令,报错,并终止执行
脚本内容:
[root@ds-master ~]# cat ./a.sh
#!/bin/bash
echo 1
set -e
set -o pipefail
abcd | echo 2
echo 3
执行情况:
[root@ds-master ~]# bash ./a.sh
1
2
./a.sh: line 5: abcd: command not found
报错在管道符后: 先执行|后的命令,报错并终止执行
脚本内容:
[root@ds-master ~]# cat ./a.sh
#!/bin/bash
echo 1
set -e
set -o pipefail
echo 2 | abcd
echo 3
执行情况:
[root@ds-master ~]# bash ./a.sh
1
./a.sh: line 5: abcd: command not found