首页 Shell 脚本选项
文章
取消

Shell 脚本选项

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别名
本文由作者按照 CC BY 4.0 进行授权

Shell 信号处理

Linux ulimit