推荐Bash提高资料:写出健壮的Bash脚本

写出健壮的Bash脚本

本文链接:http://codingstandards.iteye.com/blog/1458592

 

也就是在Bash中使用防御性编程。

什么是防御性编程? http://book.51cto.com/art/201110/299827.htm 写道
什么是防御性编程?

顾名思义,防御性编程是一种细致、谨慎的编程方法。为了开发可靠的软件,我们要设计系统中的每个组件,以使其尽可能地"保护"自己。我们通过明确地在代码中对设想进行检查,击碎了未记录下来的设想。这是一种努力,防止(或至少是观察)我们的代码以将会展现错误行为的方式被调用。
 

 

set -u  /  set -o nounset

对没有初始化的变量做替换时,报错退出。

help set 写道
-u Treat unset variables as an error when substituting.

        -o option-name
                nounset      same as -u

 

 

 

set -e  /  set -o errexit

如果执行命令的退出码不是0时,脚本立即退出。这样可以避免某些程序片段没有做错误检查而导致不可预期的结果。

help set 写道
-e Exit immediately if a command exits with a non-zero status.

        -o option-name
                errexit      same as -e

 

 

使用 "$VAR" 而不是 $VAR

对于引用变量,最好写在双引号中,而不是让它裸奔

 

因为VAR变量的值中包含空白时,就有可能造成程序出错

 

使用 "$@" 而不是 $@

因为如果某个参数中包含空白时,不加引号的$@会有问题,含空格的参数将会分裂成多个

 

 

处理信号 signal

在编写C代码时通常会在程序开始时使用signal()设置信号处理函数,使程序更加健壮。

在Bash中,可以使用 trap 对信号处理,比如删除临时文件、杀死进程等。

 

trap command signal [signal ...]

 

避免出现竞态条件

help set 写道
-C If set, disallow existing regular files to be overwritten
by redirection of output.

        -o option-name
                noclobber    same as -C

 

使用文件锁的情况,最好如下处理,以避免竞态条件:

if ( set -o noclobber; echo "$$" > "$lockfile") 2> /dev/null; then
	trap 'rm -f "$lockfile"; exit $?' INT TERM EXIT
	#critical-section
	rm -f "$lockfile"
	trap - INT TERM EXIT
else
	echo "Failed to acquire lockfile: $lockfile"
	echo "held by $(cat $lockfile)"
fi

 

 

保持原子化(事务化)

要么全部做,要么什么都不做。

比如:下面的代码展示的将文件中的一个字符串替换成另一个字符串,保证所有文件都被替换,或者都不被替换。

思路是先把要处理的文件复制到一个临时目录,进行替换操作,然后再替换原来的。即使 Ctrl+C 终止,也不会出现部分被替换的情况。

 

cp -a /var/www /var/www-tmp
for file in $(find /var/www-tmp -type -f -name "*.html"); do
	perl -pi -e 's/www.example.net/www.example.com/' $file
done
mv /var/www /var/www-old
mv /var/www-tmp /var/www
 

更详细的内容,请参看

http://sd.youkuaiyun.com/a/20120319/313229.html

 

 

 

Bash脚本教程之mktemp 命令,trap 命令 目录 临时文件的安全问题 mktemp 命令的用法 mktemp 命令的参数 trap 命令 Bash 脚本有时需要创建临时文件或临时目录。常见的做法是,在/tmp目录里面创建文件或目录,这样做有很多弊端,使用mktemp命令是最安全的做法。 临时文件的安全问题 直接创建临时文件,尤其在/tmp目录里面,往往会导致安全问题。 首先,/tmp目录是所有人可读写的,任何用户都可以往该目录里面写文件。创建的临时文件也是所有人可读的。 $ touch /tmp/info.txt $ ls -l 阅读详情

相关推荐

高级Bash脚本编程指南:从基础到实战精通

Bash中的变量无需显式声明类型,采用动态赋值方式,如。变量作用域默认为全局,但在函数中使用local关键字可创建局部变量,避免命名冲突。例如:func() {变量扩展支持${var}形式,便于在字符串中嵌入变量值或执行替换操作(如),是构建灵活脚本的基础。函数是Bash中实现逻辑复用和代码分层的基础单元。合理的函数设计不仅能减少重复代码,还能显著增强脚本的可读性和可测试性。尤其在大型运维脚本或部署工具中,通过构建独立的功能模块并按需加载,可以有效实现职责分离与团队协作开发。

weixin_42596011的博客 913

【软件推荐】一个特别好用的 bash → Git Bash(Windows使用Linux命令)

【软件推荐】一个特别好用的 bash → Git Bash(Windows使用Linux命令)

Le0v1n 的博客 1万+

支持向量机算法(带你了解原理 实践)

支持向量机作为一种强大的分类算法,在各个领域都取得了显著的成果。其基于统计学习理论的原理使得它能够在高维空间中找到最优分类超平面,并通过核函数处理非线性问题。

2303_79387663的博客 3736

WinSCP 提示:你的Shell可能与本程序不兼容(推荐使用Bash)。

将文件协议 SCP 替换为 SFTP,重新登录解决了问题。 SCP 和 SFTP 相同点和区别 最大不同之处在于「SFTP在文件传输过程中中断的话,连接后还可以继续传输,但SCP不行」。 https://blog.youkuaiyun.com/liyingke112/article/details/70598756 ...

s1162276945的博客 1万+

WebRTC TURN协议初识及turnserver实践

但是TURN协议对服务器有很高的依赖,服务器在带宽和集群上有很大的压力,所以TURN协议通常是当作ICE协议中的一部分来使用。ChannelData message不使用STUN头部,而使用一个4字节的头部,包含了一个称之为信道号的值(channel number),每一个使用中的信道号都与一个特定的peer绑定,即作为对等端地址的一个记号。该relay地址是个公网地址,可以看作是客户端A在公网上的一个代理,任何想要联系A的客户端,只要将数据发送到A的relay地址就可以了。

yinshipin007的博客 566

Gromacs实战:从蛋白质-小分子对接到分子动力学模拟全流程解析

本文详细解析了使用Gromacs进行蛋白质-小分子对接和分子动力学模拟的全流程,包括文件准备、拓扑生成、复合物构建、溶剂化处理、能量最小化及平衡模拟等关键步骤。通过实战案例,帮助研究者验证药物分子与靶标蛋白的结合稳定性,提升分子动力学模拟的效率和准确性。

weixin_29216353的博客 380

Windows环境下使用Bash命令的解决方案和命令行工具推荐(附:前端开发者 Windows 终端配置清单)

本文介绍了Windows环境下使用Bash命令的解决方案和命令行工具推荐。主要内容包括:1)通过WSL、GitBash或Cygwin在Windows运行Bash命令;2)推荐Windows Terminal+Cmder+MobaXterm三种现代终端工具,分析其特点及适用场景;3)提供选择建议:WSL适合开发主力,Cmder适合便携使用,MobaXterm适合运维需求。文章还包含实用技巧,如启用UTF-8编码和配置PATH环境变量。

木木的学习笔记 7231

PCL 三维重建 基于B样条曲线的曲面重建算法

本文将介绍如何使用B样条曲线进行三维点云数据的曲面重建。B样条曲线和曲面是一种强大的数学工具,在计算机图形学、CAD设计等领域中广泛应用。通过对点云数据进行曲面拟合和优化,最终得到精确的曲面模型。本示例展示了如何利用PCL中的B样条曲线拟合算法进行三维曲面重建,并对重建结果进行可视化。

纵马踏花向自由 658

Linux set unset命令

Linux  unset命令: 功能说明:unset是一个内建的Unix shell命令,在Bourne shell家族(sh、ksh、bash等)和C shell家族(csh、tcsh等)都有实现。它可以取消设置一个shell变量,从内存和shell的导出环境中删除它。它实现为一个壳层内建指令,因为它直接操纵shell的内部。 只读shell变量不能被unset。如果试图unset

从菜鸟到菜菜鸟 3万+

从 Classic ABAP 到 ABAP Cloud:一份面向开发者的 SAP 学习路线图与实战指南

ABAP技术演进路线:从语法到架构思维 本文系统梳理了现代ABAP开发者的能力成长路径。在S/4HANA与云时代,ABAP已从传统过程式语言转变为支持面向对象、测试驱动和云原生开发的现代技术栈。学习路线应围绕四大核心维度展开:1) 语言基础(ABAP OO/Modern ABAP);2) 工程化实践(ABAP Unit/ATC/Clean ABAP);3) 数据建模(CDS/AMDP);4) 服务化架构(Gateway/OData/Fiori)。文章强调以交付形态倒推技术栈,通过真实案例展示了如何将零散技术

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 360

LangGraph 实战教程:搭建一个智能办公多Agent协作平台

只存储必要的信息:不要把所有的原始数据都存储在状态中,比如销售数据可以存储在数据库或向量数据库中,状态中只存储数据的 ID 或摘要。使用类型提示:避免类型错误,提高代码的可维护性。支持增量更新:LangGraph 默认支持状态的增量更新(通过reduce函数),比如messages列表可以通过追加新消息的方式更新,而不是每次都重新创建整个列表。Normal Edge 的定义非常简单,只需要在StateGraph对象(稍后会详细讲解)上调用add_edge# 创建一个 StateGraph 对象。

SuperAGI2025 221

Shell与Bash介绍

Linux图形化桌面算不上精美。幸好,Linux提供了更好的与树莓派互动的方式:Shell。 1、Shell和Bash:hell是运行在终端中的文本互动程序;bash(GNU Bourne-Again Shell)是最常用的一种shell,是当前大多数Linux发行版的默认Shell。即:shell是总称,bash是shell的一个版本。 2、原理:Shell相当于是一个翻译,把我们在计算机上的操作或我们的命令,翻译为计算机可识别的二进制命令,传递给内核,以便调用计算机硬件执行相关的操作;同时,计算机执

qq_28284627的博客 3439

SWC_RTE01-AutoSAR架构【AutoSAR架构设计概述】

1 基于AutoSAR架构的概述 1.1架构层面:功能可以细分子功能,各个子功能需要交互。 -大功能可以通过Autosar组件Composition去表示; -各个子功能一般具有不可分割性,可以通过Autosar原子组件Component去表示; -各个子功能的交互可以通过接口去通信和交互; -各个子功能的行为可以通过内部行为去表示;具体表现为Runnable的设计;架构设计的时候不考虑具体的逻辑实现;只会关注Ruannble的触发事件或周期;数据访问的一致性问题;具体逻辑设计可通过模版c文件实现或通过基于

8450

推荐开源项目:bash-script-template——优化你的Bash脚本编写体验

在日常的命令行工作中,Bash脚本扮演着不可或缺的角色。为了提升工作效率和代码质量,我们常常需要一套规范化的模板来引导我们的编程实践。这就是[bash-script-template](https://github.com/ralish/bash-script-template)项目的价值所在。这个项目提供了一个集成最佳实践和实用函数的Bash脚本模板,旨在帮助开发者快速构建健壮且可维护的脚本。

gitblog_00023的博客 611

Dify智能体开发:大语言模型(LLM)问题分类

通过定义分类描述,问题分类器能够根据用户输入,使用 LLM 推理与之相匹配的分类并输出分类结果,向下游节点提供更加精确的信息。

王国平的博客 2247

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

OpenFang 内置 Shell 脚本技能指南:Bash/POSIX 健壮脚本编写的工程化实践

本篇技术指南围绕 OpenFang 开源 Agent 操作系统中内置的 `shell-scripting` 技能(Prompt-only 专家知识)展开,系统讲解其定义的 Bash/POSIX 健壮脚本编写规范,包括 `set -euo pipefail` 防线、参数展开、`trap` 清理、`getopts` 参数解析、幂等操作与并行执行等实战要点,并深入 OpenFang 技能系统源码,说明这

gitblog_00157的博客 1073

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

如何快速掌握Bash脚本自动化服务器配置:Ansible与Bash结合的终极指南

在现代服务器管理中,自动化配置已成为提升效率的关键。GitHub推荐项目精选中的awesome-bash项目(A curated list of delightful Bash scripts and resources)汇集了丰富的Bash脚本和资源,为服务器自动化配置提供了强大支持。本文将详细介绍如何将Ansible与Bash脚本结合,实现高效、可靠的服务器自动化配置,特别适合新手和普通用户快

gitblog_00750的博客 1142

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Bash命令行系统信息工具:Awesome Bash中的系统监控脚本推荐

你是否还在为找不到轻量级的系统监控工具而烦恼?还在为复杂的命令组合而头疼?本文将介绍如何利用[Awesome Bash](https://link.gitcode.com/i/d64657d8ab0baf85efb6fc6dfb4ec3f7)项目中的实用脚本,轻松实现系统信息的实时监控,无需安装复杂软件,一条命令即可掌握系统状态。 读完本文你将学会: - 快速查看CPU、内存、磁盘使用率的Bas

gitblog_00281的博客 713

如何快速掌握Bash脚本:Awesome Bash精选工具与资源全攻略

Bash作为Linux和Unix系统中最常用的命令行解释器,是开发者和系统管理员必备的技能。GitHub推荐项目精选中的awesome-bash项目,正是一个精心策划的Bash脚本和资源集合,为初学者和进阶用户提供了丰富的学习材料和实用工具。本文将带你探索这个宝藏项目中的核心资源,帮助你快速提升Bash技能。 ## 为什么选择Awesome Bash? awesome-bash项目是一个开源的

gitblog_00035的博客 677

bash-lib:终极Bash工具库,让你的Shell脚本开发效率提升10倍

bash-lib是一个功能强大的Bash工具库,专为提升Shell脚本开发效率而设计。它提供了丰富的实用方法和工具,涵盖文件处理、Git操作、日志管理、Kubernetes集成等多个领域,帮助开发者轻松应对各种复杂的脚本任务。无论是新手还是有经验的开发者,都能通过bash-lib快速构建可靠、高效的Bash脚本。 ## 🌟 核心功能模块 bash-lib采用模块化设计,将不同功能的工具方法分

gitblog_01030的博客 1063

推荐文章:深入探索bash++,带你进入高级脚本编程的新纪元

推荐文章:深入探索bash++,带你进入高级脚本编程的新纪元 在浩瀚的脚本语言宇宙中,bash长久以来以其简洁和高效占据了不可动摇的地位。然而,随着项目复杂度的增加,传统bash的局限性逐渐显现。今天,我们为您推荐一个革命性的工具——bash++,它不仅巩固了bash的地位,更是将其推向了一个全新的高度。 项目介绍 bash++,这不是一次简单的升级,而是一场bash脚本编写的革新。它引入了单元测...

gitblog_00087的博客 582

推荐文章:轻量级 Bash 下的 Key/Value 数据库 —— kv-bash

推荐文章:轻量级 Bash 下的 Key/Value 数据库 —— kv-bash 在日常的脚本编写和系统管理任务中,我们常常需要存储和检索一些简单的配置信息或临时数据。为了解决这一需求,今天我们要向大家隆重推荐一款开源小工具——kv-bash。这是一款专为 Unix 类环境设计的轻量化键值对数据库,完全基于 Bash 实现,无需任何额外依赖,简单易用且效率高。 项目介绍 kv-bash 是一个微...

gitblog_01160的博客 805

Bash-Snippets脚本调试:使用bash -x和其他工具定位问题

在使用Bash-Snippets工具集时,遇到脚本运行异常是常见情况。本文将以实际案例展示如何利用`bash -x`调试选项及项目内置测试框架,快速定位和解决问题,让你不再因脚本静默失败而困扰。 ## 调试基础:理解bash -x工作原理 `bash -x`(或`set -x`)是Bash脚本调试的核心工具,它会在执行每个命令前输出带有`+`前缀的跟踪日志。这种逐行执行的可视化过程,能帮你发现...

gitblog_00423的博客 543

learnxinyminutes-docs 深度解析:Bash 脚本编程从入门到实战

本文以 learnxinyminutes-docs 仓库中的 [乌克兰语 Bash 教程](https://link.gitcode.com/i/774bc5feebe00bc84fc83a35cea5cb2d) 为骨架,对照 [英文原版教程](https://link.gitcode.com/i/37df70e85745ec7720f2497a1a57edc9) 逐项展开,系统讲解 Bash 作

gitblog_00129的博客 912

“bash -e“ 的使用与shell脚本常见使用技巧

在当今的软件开发与系统运维领域,自动化是提升效率和保证一致性的关键。而 Shell 脚本,作为连接和驱动各种命令行工具的“胶水”,无疑是自动化工作流中不可或缺的一环。无论是简单的任务批处理,还是构建复杂的持续集成/持续部署(CI/CD)流水线,Shell 脚本都扮演着至关重要的角色。然而,编写健壮、可靠的 Shell 脚本并非易事。许多开发者,尤其是初学者,常常会陷入一个常见的陷阱:脚本在遇到错误时并不会如预期般停止,而是“默默地”继续执行下去,最终可能导致数据损坏、服务异常甚至系统崩溃等灾难性后果。

lovely_yoshino的博客 7202

bash -e的使用与shell脚本常见使用技巧

在当今的软件开发与系统运维领域,自动化是提升效率和保证一致性的关键。而 Shell 脚本,作为连接和驱动各种命令行工具的“胶水”,无疑是自动化工作流中不可或缺的一环。

古月居 1323
上一篇: Windows下调整Tomcat启动参数
下一篇: NFS攻略 - 在VirtualBox的CentOS下安装NFS碰到的问题汇总
codingstandards
博客等级 码龄16年 12粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值