options
除了使用 shopt
设置 shell options 外,还可使用 set
命令来设置 bash 的一些 options:
set -v
表示启用脚本回显功能(执行一条命令前会先打印一下)set +v
表示禁用脚本回显功能(默认就是禁用)
总之记住,set -XXX
就是启用某选项,而 set +XXX
就是禁用某选项
除了通过 set 来设置,也可通过 bash 命令行选项来传递,如 bash -v /path/to/script.sh
还可以直接在 script.sh 的脚本第一行加上 -v
选项,即 #!/bin/bash -v
有时候只希望在脚本指定位置启用一些选项,之后又关闭这些选项,这种情况下可以使用 set -v
比如只在某个函数设置 -v
,就可以在函数开头执行 set -v
启用,在函数结尾执行 set +v
关闭
脚本回显
set -v
:打印当前执行的命令
1
2
3
4
#!/bin/bash -v
echo "www.zfl9.com"
echo "www.baidu.com"
echo "www.google.com"
1
2
3
4
5
6
7
8
$ ./test.sh
#!/bin/bash -v
echo "www.zfl9.com"
www.zfl9.com
echo "www.baidu.com"
www.baidu.com
echo "www.google.com"
www.google.com
脚本调试
set -x
:比 set -v
更详细
1
2
3
4
#!/bin/bash -x
echo "www.zfl9.com"
echo "www.baidu.com"
echo "www.google.com"
1
2
3
4
5
6
7
$ ./test.sh
+ echo www.zfl9.com
www.zfl9.com
+ echo www.baidu.com
www.baidu.com
+ echo www.google.com
www.google.com
命令执行失败时退出
set -e
:只要有一个命令执行失败,就结束运行
1
2
3
4
5
#!/bin/bash -e
ech0
echo "www.zfl9.com"
echo "www.baidu.com"
echo "www.google.com"
1
2
$ ./test.sh
./test.sh: line 2: ech0: command not found
读取未定义变量时退出
set -u
:尝试读取未定义的 shell 变量时,将结束运行
1
2
3
#!/bin/bash -u
echo "$string"
echo "hello, world"
1
2
$ ./test.sh
./test.sh: line 2: string: unbound variable
管道命令执行失败时退出
set -eo pipefail
:如果管道命令的某个子命令执行失败,则结束运行
单独设置
set -o pipefail
是没效果的,要和set -e
一起使用才有效果。
1
2
3
4
#!/bin/bash
set -eo pipefail
foobar | echo "pipe"
echo "hello, world"
1
2
3
$ ./test.sh
pipe
./test.sh: line 3: foobar: command not found
脚本 options 总结
个人习惯在 shell 脚本开头加上这几行,可以极大提高脚本健壮性
1
2
3
4
5
#!/bin/bash
set -o nounset
set -o errexit
set -o pipefail
# shopt -s expand_aliases #允许alias别名