网站及其建设的心得体会,推销产品的万能句子,生成图片的网站,小型网站开发需要什么步骤文章目录 1、简述2、脚本执行过程3、set3.1 set -u3.2 set-x3.3 set -e3.4 set -o pipefail3.5 总结3.6 取消Bash参数调优 1、简述
Linux服务器脚本开发和运维管理常使用Bash脚本#xff0c;经常遇到以下场景#xff1a;
未定义变量shell内默认设置为空#xff0c;导致未定… 文章目录 1、简述2、脚本执行过程3、set3.1 set -u3.2 set-x3.3 set -e3.4 set -o pipefail3.5 总结3.6 取消Bash参数调优 1、简述
Linux服务器脚本开发和运维管理常使用Bash脚本经常遇到以下场景
未定义变量shell内默认设置为空导致未定义变量被滥用Shell脚本执行过程未知若无具体返回值时将无法确认执行过程是否正常脚本命令中若存在错误将继续执行后续命令导致脚本执行过程发生不可扭转错误
正因为前述多个场景下问题难以解决因此更需了解Bash脚本的使用与调优方法可有效降低脚本执行的安全性与可维护性。
2、脚本执行过程
例如使用Bash执行某个脚本。
[rootlocalhost ~]# bash test.sh
aaa上述命令中test.sh为shell脚本名称Bash执行时将创建一个新的shell进行执行此shell即脚本的执行环境Bash默认定义了这个shell的各种参数可使用set直接查看赋予的所有参数返回内容较多建议重定向到文件内查看
3、set
set - 用于设置shell执行环境参数 语法格式 set: set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...] set可设置shell参数较多使用set --help查看。
本文仅介绍常用的四个参数
3.1 set -u
执行Bash脚本时遇到未定义的变量时报错
[rootlocalhost ~]# cat test.sh
#!/bin/bashbbbbbb
echo $aaa
echo $bbb
[rootlocalhost ~]# bash test.sh # 未定义变量输出为空行后续命令继续执行
bbb
# 使用set -u后
[rootlocalhost ~]# vim test.sh
#!/bin/bash
set -ubbbbbb
echo $aaa
echo $bbb
[rootlocalhost ~]# bash test.sh
test.sh: line 5: aaa: unbound variable # 未定义变量报错后续命令不在执行3.2 set-x
回显Bash脚本执行过程以代表执行过程未携带则代表执行结果。
[rootlocalhost ~]# vim test.sh
#!/bin/bashbbbbbb
echo $bbb
[rootlocalhost ~]# bash test.sh
bbb
[rootlocalhost ~]# bash -x test.sh bbbbbb # 执行过程echo bbb
bbb # 执行结果3.3 set -e
当Bash脚本内存在命令执行错误时返回值非0Bash会继续执行后面命令。
[rootlocalhost ~]# vim test.sh
#!/bin/bashaaa
echo bbb
[rootlocalhost ~]# bash test.sh
test.sh: line 3: aaa: command not found
bbb上面脚本中aaa为一个不存在的命令但是Bash会忽略这个错误继续执行下面的命令实际开发中如果某个命令失败往往需要脚本停止执行防止错误累积。这时一般采用下面的写法
[rootlocalhost ~]# aaa || exit 1上面的写法表示只要aaa有非零返回值脚本就会停止执行。
常用的错误处理方法有以下几种
# 写法一
aaa|| { echo aaa failed; exit 1; }# 写法二
if ! aaa; then echo aaafailed; exit 1; fi# 写法三
aaa
if [ $? -ne 0 ]; then echo aaa failed; exit 1; fi前述方法书写较为麻烦set从根本解决上述问题使用set -e可以直接解决这个问题它使得脚本只要发生错误就终止执行。
[rootlocalhost ~]# cat test.sh
#!/bin/bash
set -eaaa
echo bbb
[rootlocalhost ~]# bash test.sh
test.sh: line 4: aaa: command not found # 执行到错误时脚本自动停止不在执行后面命令3.4 set -o pipefail
set -e存在一个特例多个子命令通过管道运算符|组合成为一个大的命令时。Bash会将最后一个子命令的返回值作为整个命令的返回值。只要最后一个子命令不失败管道命令总是会执行成功因此它后面命令依然会执行因此set -e就失去效果了。
[rootlocalhost ~]# vim test.sh
#!/bin/bash
set -eaaa | echo aaa
echo bbb
[rootlocalhost ~]# bash test.sh
test.sh: line 4: aaa: command not found
aaa
bbb因此set -o pipefail用来解决这种情况只要一个子命令失败整个管道命令就失败脚本就会终止执行
[rootlocalhost ~]# vim test.sh
#!/bin/bash
set -eo pipefailaaa | echo aaa
echo bbb
[rootlocalhost ~]# bash test.sh
aaa
test.sh: line 4: aaa: command not found # 管道符其中一个子命令执行失败则整个命令失败无法继续执行3.5 总结
set命令的上面这四个参数一般都放在一起使用。
set -euxo pipefail或在执行时带入参数
bash -euxo pipefail test.sh3.6 取消Bash参数调优
取消设置如下
set e # 使用号可以取消参数设置
set euxo pipefail