set -u
當(dāng)腳本中遇到未定義的變量時(shí)田藐,默認(rèn)是忽略宇植。
有時(shí)候這并不是開發(fā)者想要的怠苔。
假如有未定義的變量同廉,應(yīng)該報(bào)錯(cuò),并且終止腳本繼續(xù)運(yùn)行柑司。
set -u
就可以辦到
示例
#!/usr/bin/env bash
set -u
echo $a
echo shark
執(zhí)行報(bào)如下錯(cuò)誤
$ bash set.sh
set.sh: line 13: a: unbound variable
分析
image
注意
set -u
a=`ls |grep 'asfdasdf'`
echo "|$a|"
# -u 只針對(duì)未定義的變量有效
# 這種情況,變量的值會(huì)是一個(gè)空字符串
# 所以腳本會(huì)繼續(xù)執(zhí)行
set -e
set -e
的作用就是:
在腳本執(zhí)行中迫肖,有任何命令的返回值是非0
的情況,則正在運(yùn)行的腳本則會(huì)退出攒驰。
設(shè)置 -e 之前
[root@kube-master set]# cat set-e-before.sh
#!/bin/sh
foo
echo "繼續(xù)執(zhí)行"
執(zhí)行結(jié)果
[root@kube-master set]# sh set-e-before.sh
set-e-before.sh: line 3: foo: command not found
繼續(xù)執(zhí)行
設(shè)置 -e 之后
解決辦法是在腳本中設(shè)置 set -e
[root@kube-master set]# cat set-e-after.sh
#!/bin/sh
set -e
foo
echo "繼續(xù)執(zhí)行"
執(zhí)行結(jié)果
[root@kube-master set]# sh set-e-after.sh
set-e-after.sh: line 5: foo: command not found
但是蟆湖,對(duì)于一組含有管道的命令無效,比如:
#!/usr/bin/env bash
set -e
foo | echo "shark" # 注意這里有管道符
echo "程序會(huì)繼續(xù)運(yùn)行"
執(zhí)行結(jié)果
[root@kube-master set]# sh set-e.sh
shark
set-e.sh: line 2: foo: command not found # 這是報(bào)錯(cuò)信息
程序會(huì)繼續(xù)運(yùn)行
foo
不是 shell 中的命令玻粪,執(zhí)行會(huì)報(bào)錯(cuò)隅津,但是其后面有個(gè)管道诬垂,最終管道后的echo
命令執(zhí)行成功了,這種情況下 腳本會(huì)繼續(xù)執(zhí)行。
解決辦法是使用下面的 set -o pipefail
set -o pipefail
需要和
set -e
配合使用饥瓷。
如果設(shè)置剥纷,如果管道中的所有命令都成功退出,整條命令的返回值才是0
呢铆。否則返回非0
晦鞋。
默認(rèn)情況下禁用此選項(xiàng)
示例腳本內(nèi)容
# 設(shè)置 set -o pipefail 后,此時(shí)腳本就會(huì)終止運(yùn)行
set -e
set -o pipefail
foo |echo ''
echo shark
執(zhí)行效果
[root@kube-master set]# sh set-e-pipefail.sh
set-e-pipefail.sh: line 4: foo: command not found