Linux Shell 脚本编程最佳实践

Linux Shell 脚本编程最佳实践,第1张

IT路边社

前言

与其它的编码规范一样,这里所讨论的不仅仅是编码格式美不美观的问题, 同时也讨论一些约定及编码标准。这份文档主要侧重于我们所普遍遵循的规则,对于那些不是明确强制要求的,我们尽量避免提供意见。

编码规范对于程序员而言尤为重要,有以下几个原因:

本文档中的准则致力于最大限度达到以下原则:

尽管本文档涵盖了许多基础知识,但应注意的是,没有编码规范可以为我们回答所有问题,开发人员始终需要再编写完代码后,对上述原则做出正确的判断。

:未明确指明的则默认为必须(Mandatory)

主要参考如下文档:

仅建议Shell用作相对简单的实用工具或者包装脚本。因此单个shell脚本内容不宜太过复杂。

在选择何时使用shell脚本时时应遵循以下原则:

可执行文件不建议有扩展名,库文件必须使用 .sh 作为扩展名,且应是不可执行的。

执行一个程序时,无需知道其编写语言,且shell脚本并不要求具有扩展名,所以更倾向可执行文件没有扩展名。

而库文件知道其编写语言十分重要,使用 .sh 作为特定语言后缀的扩展名,可以和其他语言编写的库文件加以区分。

文件名要求全部小写, 可以包含下划线 _ 或连字符 - , 建议可执行文件使用连字符,库文件使用下划线。

正例:

反例:

源文件编码格式为UTF-8。避免不同 *** 作系统对文件换行处理的方式不同,一律使用 LF 。

每行最多不超过120个字符。每行代码最大长度限制的根本原因是过长的行会导致阅读障碍,使得缩进失效。

除了以下两种情况例外:

如出现长度必须超过120个字符的字符串,应尽量使用here document或者嵌入的换行符等合适的方法使其变短。

示例:

除了在行结束使用换行符,空格是源文件中唯一允许出现的空白字符。

对从来没有用到的或者被注释的方法、变量等要坚决从代码中清理出去,避免过多垃圾造成干扰。

Bash 是唯一被允许使用的可执行脚本shell。

可执行文件必须以 #!/bin/bash 开始。请使用 set 来设置shell的选项,使得用 bash echo "Process $: Done making $$$."

# 示例7:命令参数及路径不需要引号 grep -li Hugo /dev/ "$1"

# 示例8:常规变量用双引号,ccs可能为空的特殊情况可不用引号 git send-email --to "${reviewers}" ${ccs:+"--cc" "${ccs}"}

# 示例9:正则用单引号,$1可能为空的特殊情况可不用引号 grep -cP '([Ss]pecial||?characters*) ${1:+"$1"}

# 示例10:位置参数传递推荐带引号的"$@",所有参数作为单字符串传递用带引号的"$*" # content of t.sh func_t { echo num: $# echo args: 1:$1 2:$2 3:$3 }

func_t "$@" func_t "$*" # 当执行 ./t.sh a b c 时输出如下: num: 3 args: 1:a 2:b 3:c num: 1 args: 1:a b c 2: 3:

使用 $(command) 而不是反引号。

因反引号如果要嵌套则要求用反斜杠转义内部的反引号。而 $(command) 形式的嵌套无需转义,且可读性更高。

正例:

反例:

条件测试

使用 [[ ... ]] ,而不是 [ , test , 和 /usr/bin/[ 。

因为在 [[ 和 ]] 之间不会出现路径扩展或单词切分,所以使用 [[ ... ]] 能够减少犯错。且 [[ ... ]] 支持正则表达式匹配,而 [ ... ] 不支持。参考以下示例:

尽可能使用变量引用,而非字符串过滤。

Bash可以很好的处理空字符串测试,请使用空/非空字符串测试方法,而不是过滤字符,让代码具有更高的可读性。正例:

反例:

正例:

反例:

正例:

反例:

文件名扩展

当进行文件名的通配符扩展时,请指定明确的路径。

当目录中有特殊文件名如以 - 开头的文件时,使用带路径的扩展通配符 ./* 比不带路径的 * 要安全很多。

应该避免使用eval。

Eval在用于分配变量时会修改输入内容,但设置变量的同时并不能检查这些变量是什么。反例:

请使用进程替换或者for循环,而不是通过管道连接while循环。

这是因为在管道之后的while循环中,命令是在一个子shell中运行的,因此对变量的修改是不能传递给父shell的。

这种管道连接while循环中的隐式子shell使得bug定位非常困难。反例:

如果你确定输入中不包含空格或者其他特殊符号(通常不是来自用户输入),则可以用for循环代替。例如:

使用进程替换可实现重定向输出,但是请将命令放入显式子 shell,而非 while 循环创建的隐式子 shell。例如:

总是检查返回值,且提供有用的返回值。

对于非管道命令,使用 $? 或直接通过 if 语句来检查以保持其简洁。

例如:

当内建命令可以完成相同的任务时,在shell内建命令和调用外部命令之间,应尽量选择内建命令。

因内建命令相比外部命令而言会产生更少的依赖,且多数情况调用内建命令比调用外部命令可以获得更好的性能(通常外部命令会产生额外的进程开销)。

正例:

反例:

加载外部库文件不建议用使用.,建议使用source,已提升可阅读性。正例:

反例:

除非必要情况,尽量使用单个命令及其参数组合来完成一项任务,而非多个命令加上管道的不必要组合。常见的不建议的用法例如:cat和grep连用过滤字符串cat和wc连用统计行数grep和wc连用统计行数等。

正例:

除特殊情况外,几乎所有函数都不应该使用exit直接退出脚本,而应该使用return进行返回,以便后续逻辑中可以对错误进行处理。正例:

反例:

推荐以下工具帮助我们进行代码的规范:

原文链接:http://itxx00.github.io/blog/2020/01/03/shell-standards/

获取更多的面试题、脚本等运维资料点击: 运维知识社区 获取

脚本之---短信轰炸机

脚本之---QQ微信轰炸机

ansible---一键搭建redis5.0.5集群

elk7.9真集群docker部署文档

全球最全loki部署及配置文档

最强安全加固脚本2.0

一键设置iptbales脚本

《Linux运维最佳实践》百度网盘pdf最新全集下载:

链接: https://pan.baidu.com/s/14x_Rpmkrbg6C6J85vuAOcg

?pwd=uvsd 提取码: uvsd

简介:本书是运维领域的璀璨明珠,是一本有思想的运维技术干货集!

技术层面,作者从高性能网站架构、服务器安全和监控、网络分析、自动化运维和游戏运维4个方向,梳理和总结了105个棘手的运维难题,结合自己10余年的工作经验,对这些问题给出了经过实践检验的解决方案,可直接应用到生产环境中。除解决方案外,还详细讲解了每个问题背后涉及的技术原理(共涉及21种技术)。

思想层面,本书不仅有作者对运维服务体系的深度思考,而且还有作者的主动运维思维和宏观的运维格局,更有作者解决具体运维问题的思维方法。

通过本书,不仅能解决具体的技术难题,提高工作效率,而且还能增强技术功底,提升工作能力。更重要的是,它能让我们明白,技术不是运维的终追求,思想才是运维人员应该毕生修炼的目标!  

从初中开始知道Linux是什么,到大学时期喜欢Linux、研究Linux,再到现在以Linux为职业。 从在CII800上安装Redhat7.2,到给P42.4A上装7个 *** 作系统,再到现在到处给公司的服务器安装Linux。Linux伴随我度过很多时光,眼看着它从初露锋芒到大展才华,我对Linux也颇有感情啊。

Linux前途无量,以下整理一些我学习Linux的过程中找到的好的东西(难度由简到难),推荐给大家分享:

Ubuntu 速配指南

安装Ubuntu的话,一定要按照Ubuntu入门指南走一遍。绝好的学习资源,可以了解系统设置的方法,了解软件源的概念,是每个Ubuntu新用户必看的资源。

纯中文CentOS攻略站

一步步教你在CentOS4.4下配置常用服务。示范用的系统虽然老了一些,但是按照网站的教程配置几遍,保准你一下子掌握Redhat系统下几个常用服务,如SSH,FTP,Samba,MySQL,Apache等的配置。比看枯燥的数据或视频要有趣几倍,效果也要好很多倍。想当年,俺一直在Linux 门外徘徊,直到跟着纯中文功率站配置了几遍服务器,感觉一下子踏进了Linux的大门(当年俺直接而二手市场,买了个二手电脑回来专门配置Linux服务器)。

《Red Hat Linux用户基础》

RHCE考试的教材,也是入门的好书,学完之后还可以考证,我们公司很多人都是学这个入门的。不过看起来相对枯燥一点。

《Linux 程序设计》

Linux程序设计的绝对入门好书,介绍全面易懂,翻译也还行。本人在大学期间一直从图书馆借着看,毕业后觉得不过瘾自己又买一本。Linux入门编程强烈推荐。

《Linux内核技术手册》

Linux内核技术手册封皮

使用Linux哪一点说出来觉得最拽:自己升级内核。老早很崇拜的一句话,起始升级内核一点都不神秘,简直和安装软件一样简单。这本书详细介绍了从内核源代码下载,编译,安装升级的整个过程。之前俺买了本英文版看,现在终于出中文版本了。进阶用户强烈推荐!!

《Linux内核设计与实现》

想学内核,千万别买《深入理解LINUX内核》,看到你头发都白了也看不完。这本设计与实现,很好的衔接了理论与实践,也足够简洁,不至于让人读到天荒地老。实在是想深入研究内核的话,也应该先看看这本书做铺垫。

《LINUX设备驱动程序》

最佳实践教程,想写驱动或者从实践角度了解内核原理都应该看这本书。绝对经典,连日本的XX片都用这本书当道具。

最后,说一下学习Linux的建议。记得,学习Linux的关键是要多实践。除了超级初学的人,对于其他人都推荐直接在计算机上安装一个Linux。虚拟机太容易退出到Windows环境,给你很多退缩的余地。首次安装Linux,在分区时一定要小心,千万不能选择“Entire disk”,否则就杯具了。最好是删除一个windows分区,然后在安装Linux的时候选择“最大连续空闲空间”。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/7374283.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-04
下一篇 2023-04-04

发表评论

登录后才能评论

评论列表(0条)

保存