set 命令:可以用来定制shell环境
$- 变量
h:hashall,打开选项后,Shell 会将命令所在的路径hash下来,避免每次都要查询。通过set +h将h选
项关闭
i:interactive-comments,包含这个选项说明当前的 shell 是一个交互式的 shell。所谓的交互式shell,
在脚本中,i选项是关闭的
m:monitor,打开监控模式,就可以通过Job control来控制进程的停止、继续,后台或者前台执行等
B:braceexpand,大括号扩展
H:history,H选项打开,可以展开历史列表中的命令,可以通过!感叹号来完成,例如“!!”返回上最近的
一个历史命令,“!n”返回第 n 个历史命令
set 命令实现脚本安全
-u 在扩展一个没有设置的变量时,显示错误信息, 等同set -o nounset
-e 如果一个命令返回一个非0退出状态值(失败)就退出, 等同set -o errexit
-o option 显示,打开或者关闭选项
显示选项:set -o
打开选项:set -o 选项
关闭选项:set +o 选项
-x 当执行命令时,打印命令及其参数,类似 bash -x
范例:
[root@centos8 ~]#set -o
allexport off
braceexpand on
emacs on
errexit off
errtrace off
functrace off
hashall on
histexpand on
history on
ignoreeof off
interactive-comments on
keyword off
monitor on
noclobber off
noexec off
noglob off
nolog off
notify off
nounset off
onecmd off
physical off
pipefail off
posix off
privileged off
verbose off
vi off
xtrace off
为了避免脚本中出现空变量,导致删根需要让nounset 开启,增加 set -u 命令
为了避免脚本中命令出错,导致继续执行需要让errexit 开启,增加 set -e 命令
#!/bin/bash
set -ue
DIR=/data1
#xxxx
rm -rf /data/tmp/$DIR1/*
echo fininshed
[root@centos8 data]#: mkdir tmp
[root@centos8 data]#: touch /data/tmp/a.txt /data/tmp/b.txt
[root@centos8 data]#: ls /data/tmp/
a.txt b.txt
[root@centos8 data]#: chmod +x test.sh
[root@centos8 data]#: bash test.sh
test.sh: line 16: DIR1: unbound variable
[root@centos8 data]#: ls /data/tmp/
a.txt b.txt
以上新建tmp文件夹模拟上级目录为根目录,若以上脚本不加 set -u ,就会因为$DIR1是空变量,而删除上级目录。同时也避免因为执行 “xxxx” 命令报错,而向下继续执行命令。