shell脚本内一些set 命令的使用
# shell脚本内一些set 命令的使用
在shell脚本中添加set指令能设置所使用shell的执行方式,可依照不同的需求来做设置
# set -e
没有使用set -e
的时候,shell脚本默认遇到错误也可以继续执行下去。这在一些重要场景下是很危险的操作,因为很有可能因为很小的错误引发一连串的大问题,因而,我们需要使用set -e
去限制错误脚本的运行。
- 下面以一个简单的示例说明
set -e
的作用:
待执行的test.sh中,尝试列出h.sh的内容
[root@centos7 ~]# cat test.sh
#!/bin/bash
cat h.sh
echo "this is my script file"
2
3
4
5
而若本地不存在这个"h.sh"
文件,此时执行test.sh
就会报错,其输出像这样:
cat: h.sh: No such file or directory
this is my script file
2
可以看到,即使脚本遇到错误,后续的命令依旧执行了。而有些时候,我们希望程序执行遇到错误时不要再继续了,而是应该退出,此时就应该在脚本中加上set -e
[root@centos7 ~]# cat test.sh
#!/bin/bash
set -e
cat h.sh
echo "this is my script file"
2
3
4
5
6
7
此时,当我们再次执行test.sh
脚本时,程序的输出内容将会发生改变:
cat: h.sh: No such file or directory
可以看到,在脚本运行遇到错误后,会输出错误信息,然后就不再执行后续的命令了。
# set -u
该命令用以检查脚本内的变量,如果有变量未被定义将终止脚本。适用于脚本的自我检测。
- 下面是一个简单的脚本示例
[root@centos7 ~]# cat test.sh
#!/bin/bash
set -u
echo $A
echo "helloworld"
2
3
4
5
执行test.sh
后,终端会输出下面的错误信息:
./test.sh: line 3: A: unbound variable
通过错误信息,我们可以看到,由于变量A没有事先定义,导致程序自检未通过,从而报错,脚本终止了。
# set -x 和set +x
"set -x"
和"set +x"
是用于shell调试的,它们其实是一个显示脚本执行过程并将脚本内的变量的值暴露出来的一个开关,-x
是开,+x
等于是默认的关闭,一般情况下,脚本是关闭这个显示过程的。
下面是一个使用示例:
[dxzh@centos7 demo]$ cat ./test.sh
#!/bin/bash
set -x
c=$(pwd)
s=$(pwd)/a.sh
if [ -d $c ]
then
echo $c is a dictionary
fi
set +x
if [ -f $s ]
then
echo "$s is a file"
fi
2
3
4
5
6
7
8
9
10
11
12
13
14
在执行./test.sh
后,它将会输出下面的结果:
++ pwd
+ c=/home/dxzh/scripts/demo
++ pwd
+ s=/home/dxzh/scripts/demo/a.sh
+ '[' -d /home/dxzh/scripts/demo ']'
+ echo /home/dxzh/scripts/demo is a dictionary
/home/dxzh/scripts/demo is a dictionary
+ set +x
/home/dxzh/scripts/demo/a.sh is a file
2
3
4
5
6
7
8
9
可以看到,在set -x
命令后,程序中的每条含变量的的语句都被打印出来了,且能直观看到变量值,而在set +x
命令后,对应的变量值则不会被打印和显示。
# 总结
set -e (debug断点模式),这个在脚本的流程控制中常常用到,比如,某一个脚本,不希望见到任何错误(返回值非零表示错误),因为这个错误对于脚本工作很重要,比如安装脚本,前面都错了,后面的行还在执行,有可能造成灾难性的后果,这将大大的提高脚本的健壮性。
set -u (专门针对变量的模式),如果有未赋值定义的变量,通常对程序意味着冗余,无效,这不是我们所希望的事情。(如果,shell使用了大量的变量的话),或者,某个变量为空,而在脚本内rm -rf 变量,此时,set -u将会保护你,因为,如果为空,而又没有-u,rm -rf 命令将会删除一切,这个时候,你设置了set -u 可能会救你一命!!!
set -x 显示脚本执行过程,并显示脚本对变量的处理结果。如果,某一个脚本使用了大量的变量,而我们希望能看到这些变量的传递,使用是否正确,那么,set -x 将是你很好的选择。(快速定位问题,尤其是变量所产生的问题)
综上,set -ue可以保证shell脚本的健壮性!!!set -x 可以为你提供可视化的变量值检查。如果有危险命令,比如> 重定向,rm -rf 删除,这些,请尽量使用这些set。