set -u
在shell腳本中未定義的變量默認(rèn)會(huì)忽略恭陡;然而這樣會(huì)導(dǎo)致一些錯(cuò)誤變量秕衙;可以在shell腳本輸入set -u
set -u的作用:在腳本中出現(xiàn)沒定義的變量的時(shí)候運(yùn)行的時(shí)候會(huì)報(bào)錯(cuò)并且中斷運(yùn)行站绪;
>不加set的時(shí)候
[root@localhost ~]# sh /root/shell_learning/set-u.sh
shark!
shark
..................................................................................................
set -u <-------只加入這一行
echo shark!
echo $a
echo shark
--------->執(zhí)行結(jié)果
[root@localhost shell_learning]# sh set-u.sh
shark! //錯(cuò)誤之前的還是會(huì)運(yùn)行
set-u.sh: line 3: a: unbound variable
set -e
set -e 的作用:在運(yùn)行腳本的時(shí)候如果腳本出現(xiàn)的命令有出現(xiàn)非零的情況就會(huì)中斷、退出鸣皂。
>不加set -t的時(shí)候
[root@localhost ~]# sh set-e.sh
jj
set-e.sh: line 4: foo: command not found
繼續(xù)執(zhí)行
............................................................................
#!/bin/sh
set -e <---------------只加入這一行
echo jj
foo
echo "繼續(xù)執(zhí)行"
-------->執(zhí)行結(jié)果
[root@localhost ~]# sh set-e.sh
jj
set-e.sh: line 4: foo: command not found
- 注意:set -e對(duì)于有管道的命令無效。要使得程序在遇到管道錯(cuò)誤命令時(shí)候中斷退出,就要配合set -o pipefail使用
如下:
不加set -o pipefail時(shí)
#!/bin/sh
set -e
echo jj
foo |echo shark
echo "繼續(xù)執(zhí)行"
---------------->執(zhí)行結(jié)果
[root@localhost ~]# sh set-e.sh
jj
set-e.sh: line 4: foo: command not found #有錯(cuò)誤還是執(zhí)行了
shark
繼續(xù)執(zhí)行
.......................................................
#!/bin/sh
set -e
set -o pipefail <---------只加入了這樣行
echo jj
foo |echo shark
echo "繼續(xù)執(zhí)行"
-------------->執(zhí)行結(jié)果
[root@localhost ~]# sh set-e.sh
jj
set-e.sh: line 5: foo: command not found
shark <----不再往后執(zhí)行了
set -x
查看執(zhí)行的過程
#!/bin/sh
set -e
set -x <---------對(duì)比上面的結(jié)果可以看出差異
set -o pipefail
echo jj
foo |echo shark
echo "繼續(xù)執(zhí)行"
------------------->執(zhí)行結(jié)果
[root@localhost shell_learning]# sh set-e.sh
+ set -o pipefail
+ echo jj
jj
+ foo
set-e.sh: line 6: foo: command not found
+ echo shark
shark
set的所有命令都可以在命令行寫
shell腳本 ------------------------>命令行
set -u -----------------------------> sh -u name.txt
set -e -----------------------------> sh -e name .txt
set -e -o pipefail----------------> sh -e -o pipefail name.txt
set -x -----------------------------> sh -x name.txt