set -u
在shell脚本中未定义的变量默认会忽略;然而这样会导致一些错误变量;可以在shell脚本输入set -u
set -u的作用:在脚本中出现没定义的变量的时候运行的时候会报错并且中断运行;
>不加set的时候
[root@localhost ~]# sh /root/shell_learning/set-u.sh
shark!
shark
..................................................................................................
set -u <-------只加入这一行
echo shark!
echo $a
echo shark
--------->执行结果
[root@localhost shell_learning]# sh set-u.sh
shark! //错误之前的还是会运行
set-u.sh: line 3: a: unbound variable
set -e
set -e 的作用:在运行脚本的时候如果脚本出现的命令有出现非零的情况就会中断、退出。
>不加set -t的时候
[root@localhost ~]# sh set-e.sh
jj
set-e.sh: line 4: foo: command not found
继续执行
............................................................................
#!/bin/sh
set -e <---------------只加入这一行
echo jj
foo
echo "继续执行"
-------->执行结果
[root@localhost ~]# sh set-e.sh
jj
set-e.sh: line 4: foo: command not found
- 注意:set -e对于有管道的命令无效。要使得程序在遇到管道错误命令时候中断退出,就要配合set -o pipefail使用
如下:
不加set -o pipefail时
#!/bin/sh
set -e
echo jj
foo |echo shark
echo "继续执行"
---------------->执行结果
[root@localhost ~]# sh set-e.sh
jj
set-e.sh: line 4: foo: command not found #有错误还是执行了
shark
继续执行
.......................................................
#!/bin/sh
set -e
set -o pipefail <---------只加入了这样行
echo jj
foo |echo shark
echo "继续执行"
-------------->执行结果
[root@localhost ~]# sh set-e.sh
jj
set-e.sh: line 5: foo: command not found
shark <----不再往后执行了
set -x
查看执行的过程
#!/bin/sh
set -e
set -x <---------对比上面的结果可以看出差异
set -o pipefail
echo jj
foo |echo shark
echo "继续执行"
------------------->执行结果
[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