Shell ❀ Bash脚本调优方式详解

文章目录

  • 1、简述
  • 2、脚本执行过程
  • 3、set
    • 3.1 set -u
    • 3.2 set-x
    • 3.3 set -e
    • 3.4 set -o pipefail
    • 3.5 总结
    • 3.6 取消Bash参数调优

1、简述

Linux服务器脚本开发和运维管理常使用Bash脚本,经常遇到以下场景:

  • 未定义变量shell内默认设置为空,导致未定义变量被滥用;
  • Shell脚本执行过程未知,若无具体返回值时将无法确认执行过程是否正常;
  • 脚本命令中若存在错误,将继续执行后续命令,导致脚本执行过程发生不可扭转错误;

正因为前述多个场景下问题难以解决,因此更需了解Bash脚本的使用与调优方法,可有效降低脚本执行的安全性与可维护性。

2、脚本执行过程

例如:使用Bash执行某个脚本。

[root@localhost ~]# 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脚本时遇到未定义的变量时报错

[root@localhost ~]# cat test.sh 
#!/bin/bashbbb=bbb
echo $aaa
echo $bbb
[root@localhost ~]# bash test.sh # 未定义变量输出为空行,后续命令继续执行
bbb
# 使用set -u后
[root@localhost ~]# vim test.sh 
#!/bin/bash
set -ubbb=bbb
echo $aaa
echo $bbb
[root@localhost ~]# bash test.sh 
test.sh: line 5: aaa: unbound variable		# 未定义变量报错,后续命令不在执行

3.2 set-x

回显Bash脚本执行过程,以+代表执行过程,未携带则代表执行结果。

[root@localhost ~]# vim test.sh 
#!/bin/bashbbb=bbb
echo $bbb
[root@localhost ~]# bash test.sh 
bbb
[root@localhost ~]# bash -x test.sh 
+ bbb=bbb									# 执行过程
+ echo bbb
bbb											# 执行结果

3.3 set -e

当Bash脚本内存在命令执行错误时(返回值非0),Bash会继续执行后面命令。

[root@localhost ~]# vim test.sh 
#!/bin/bashaaa
echo bbb
[root@localhost ~]# bash test.sh 
test.sh: line 3: aaa: command not found
bbb

上面脚本中aaa为一个不存在的命令,但是Bash会忽略这个错误继续执行下面的命令,实际开发中,如果某个命令失败,往往需要脚本停止执行,防止错误累积。这时,一般采用下面的写法

[root@localhost ~]# 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可以直接解决这个问题,它使得脚本只要发生错误,就终止执行。

[root@localhost ~]#  cat test.sh 
#!/bin/bash
set -eaaa
echo bbb
[root@localhost ~]# bash test.sh 
test.sh: line 4: aaa: command not found		# 执行到错误时,脚本自动停止不在执行后面命令

3.4 set -o pipefail

set -e存在一个特例,多个子命令通过管道运算符|组合成为一个大的命令时。Bash会将最后一个子命令的返回值,作为整个命令的返回值。只要最后一个子命令不失败,管道命令总是会执行成功,因此它后面命令依然会执行,因此set -e就失去效果了。

[root@localhost ~]# vim test.sh
#!/bin/bash
set -eaaa | echo aaa
echo bbb
[root@localhost ~]# bash test.sh 
test.sh: line 4: aaa: command not found
aaa
bbb

因此set -o pipefail用来解决这种情况,只要一个子命令失败,整个管道命令就失败,脚本就会终止执行

[root@localhost ~]# vim test.sh
#!/bin/bash
set -eo pipefailaaa | echo aaa
echo bbb
[root@localhost ~]# bash test.sh 
aaa
test.sh: line 4: aaa: command not found			# 管道符其中一个子命令执行失败则整个命令失败,无法继续执行

3.5 总结

set命令的上面这四个参数,一般都放在一起使用。

set -euxo pipefail

或在执行时带入参数

bash -euxo pipefail test.sh

3.6 取消Bash参数调优

取消设置如下:

set +e					# 使用+号可以取消参数设置
set +euxo pipefail

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/20732.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

switch分支实现周一到周五的安排

switch分支实现周一到周五的安排 分析需求代码实现小结Time 唠嗑浅分析一下switch的执行流程 ①先执行switch(表达式) 中表达式的值,再拿这个值去与case后的值进行匹配。 ②与那个case后的值匹配为true就执行那个case块的代码,遇到break就跳出switch分支…

洛谷 P1119 灾后重建

原题链接: 灾后重建 - 洛谷 题目大意: 有n个村庄,村庄间有m条公路,一次地震将连向每个村庄的公路损坏,所以要进行维修,数据保证编号小的村庄维修时间更少,编号大的村庄维修时间更多。后面有q个…

固定资产管理软件

固定资产全生命周期管理软件采用先进的RFID技术,从采购、入库、借用、总结、清理到损坏等方面准确统计资产,突破过去手工统计的复杂性,节省资产资源,减少调查时间,确保资产管理工作的准确性和快速性。 固定资产管理软…

MySQL概述与体系结构

文章目录 一、MySQL概述1.1 MySQL与redis的区别1.2 数据处理分类1.3 SQL1.4 数据类型 二、数据库设计三范式2.1 范式一2.2 范式二2.3 范式三2.4 反范式 三、MySQL体系结构3.1 结构组成3.2 连接池 四、sql语句执行过程4.1 select语句4.2 CRUD执行过程 一、MySQL概述 1.1 MySQL与…

(YouTube)KDBA QML 学习笔记1

&#xff08;YouTube&#xff09;KDBA QML 学习笔记 旧版本(QML文件介绍) main.qml import QtQuick 2.0Text {text: "Hell World" }main.cpp #include <QtQuick>int mian(int argc, char *argn[]) {QGuiApplication app(argc, argv);//QT开始 QQuickvi…

【力扣】 12. 整数转罗马数字 模拟

力扣 12. 整数转罗马数字 解题思路 当某个位数的某个数不为4或9时&#xff0c;高位对应的字符总是在低位对应的字符前面。只有当该数为4或9时&#xff0c;低位对应的字符在高位前面。 根据这一特性&#xff0c;我们进行分类讨论。 1.当数为4时&#xff0c;则对应的罗马数为 10 …

一文带你了解TCP/IP模型以及封装和分用

文章目录 1. 网络协议2. OSI七层网络模型3.TCP/IP (五层/四层)4. 封装和分用 1. 网络协议 网络协议是计算机网络中用于规定数据在网络中传输和处理的规则&#xff0c;它定义了在网络中通信的格式、规范和顺序。网络协议可以分为不同的层次&#xff0c;每个层次负责不同的功能和…

Python模块psycopg2连接postgresql

目录 1. 基础语法 2. 基础用法 3. 多条SQL 4. 事务SQL 1. 基础语法 语法 psycopg2.connect(dsn #指定连接参数。可以使用参数形式或 DSN 形式指定。host #指定连接数据库的主机名。dbname #指定数据库名。user #指定连接数据库使用的用户名。…

Matlab实现Kmeans++算法(每行代码标注详细注解)

逐行代码讲解Kmeans算法的原理及其实现&#xff0c;后续将更新该算法的进一步优化的代码的讲解 目录 一、什么是Kmeans算法 二、Kmeans算法原理 三、Kmeans算法代码解析 四、总结 一、什么是Kmeans算法 K-means算法的优点是简单易实现&#xff0c;计算效率高&#xff0c;适…

寄存器详解(一)

目录 前言&#xff1a; 通用寄存器 示例&#xff1a; 通用寄存器的划分 汇编指令 cpu物理地址的形成 地址加法器运算示例&#xff1a; 1. 相关部件提供段地址和偏移地址 2. 段地址和偏移地址送入地址加法器 3. 段地址*16 4. 求出物理地址 5. 输出物理地址 段的概念 Deb…

[C++项目] Boost文档 站内搜索引擎(3): 建立文档及其关键字的正排 倒排索引、jieba库的安装与使用...

之前的两篇文章: 第一篇文章介绍了本项目的背景, 获取了Boost库文档 &#x1fae6;[C项目] Boost文档 站内搜索引擎(1): 项目背景介绍、相关技术栈、相关概念介绍…第二篇文章 分析实现了parser模块. 此模块的作用是 对所有文档html文件, 进行清理并汇总 &#x1fae6;[C项目] …

309. 买卖股票的最佳时机含冷冻期

给定一个整数数组prices&#xff0c;其中第 prices[i] 表示第 i 天的股票价格 。​ 设计一个算法计算出最大利润。在满足以下约束条件下&#xff0c;你可以尽可能地完成更多的交易&#xff08;多次买卖一支股票&#xff09;: 卖出股票后&#xff0c;你无法在第二天买入股票 …

牛客网Verilog刷题——VL56

牛客网Verilog刷题——VL56 题目答案 题目 实现4bit无符号数流水线乘法器设计。电路的接口如下图所示&#xff1a; 输入输出描述&#xff1a; 信号类型输入/输出位宽描述clkwireInput1系统时钟信号rst_nwireInput1异步复位信号&#xff0c;低电平有效mul_awireInputsize乘数mu…

Selenium Chrome Webdriver 如何获取 Youtube 悬停文本

导语 Youtube 是一个非常流行的视频分享平台&#xff0c;有时候我们可能想要爬取一些视频的信息&#xff0c;比如标题、播放量、点赞数等。但是有些信息并不是直接显示在网页上的&#xff0c;而是需要我们将鼠标悬停在某个元素上才能看到&#xff0c;比如视频的时长、上传时间…

自动化测试学习方向

1. 首先要搞明白几个问题 本来想写一些东西&#xff0c;但忽然发现虫师已经对这个问题总结很到位了&#xff0c;所以我也就不想多说什么&#xff0c;放上链接&#xff0c;学自动化测试之前&#xff0c;先去看看吧 在做自动化测试之前你需要知道的 2. 语言基础 很多想学自动化…

NGZORRO:动态表单/模型驱动 的相关问题

官网的demo的[nzFor]"control.controlInstance"&#xff0c;似乎是靠[formControlName]"control.controlInstance"来关联的。 <form nz-form [formGroup]"validateForm" (ngSubmit)"submitForm()"><nz-form-item *ngFor&quo…

ThinkPHP v6.0.8 CacheStore 反序列化漏洞

漏洞说明 1. 漏洞原理&#xff1a;ThinkPHP 6.0.8 CacheStore 会触发POP利用链子&#xff0c;造成任意命令执行 2. 组件描述&#xff1a; ThinkPHP是一个免费开源的&#xff0c;快速、简单的面向对象的轻量级PHP开发框架 3. 影响版本&#xff1a;V6.0.8 漏洞复现 1. 环境安…

Docker实践:使用Docker搭建个人开发环境(极简版)

文章目录 说明教程1. 编写 Dockerfile2. 编写 docker-compose.yml3. 使用容器创建容器启动容器进入容器命令行VSCode 4. 关闭容器5. 备份容器导出导入 6. 重置容器 相关资料文章合集详细了解本文在个人电脑上安装 Docker容器使用 NVIDIA 显卡托管镜像运行GUI程序 说明 本文是在…

git删除已经提交的大文件

当你不小心把一个巨大的二进制文件提交到git仓库的时候&#xff0c;此时删除再提交也没有用了&#xff0c;大文件已经在仓库中留底了。另外比如需要删除某个需要保密的文件&#xff0c;都是相同的解决办法。 我本来想着把dll放在三方库里面提交到仓库里&#xff0c;省得在不同…

3.playbook剧本二

文章目录 playbook二Roles模块roles模式安装LNMP创建nginxfiles目录handlers目录tasks目录templates目录vars目录 创建mysqltasks目录 创建phpfiles目录handlers目录tasks目录templates目录vars目录 创建LNMP剧本文件 playbook二 Roles模块 角色的作用&#xff1a;把playbook…