如何编写可靠shell
前言
于是花了些功夫查阅资料,给团队做了一次分享,始有此文。在这里,笔者无视那些众多的shell解释器,就以Linux标准的bash为例,斗胆整理了了一份关于shell的部分编写建议作为自己写shell时的参考指南,还请各位读者抱着批判性思维来审阅。
开头指定bash
3、#!/usr/bin/env bash 的方式通过添加env中间层,使得可以在$PATH中搜索bash,提供灵活性、适应性
用双引号包围变量
运行会报错,因为等号前后字符串个数不一致。正确的做法是如下代码:
全部代码进函数
最常见到的不规范的写法就是大家的shell全都不在函数中,一条条命令顺序执行(笔者以前也经常这么写)。
使用readonly定义常量
关注变量作用域
1、Shell中默认变量作用域为全局(无论定义在外层还是函数中)
3、如果必须定义全局变量,则建议全局变量大写
警惕未被初始化的变量
如果运行上面的脚本,参数为空的话,你的根目录的data目录就被删掉了。可以使用nounset标志来防止这种意外情况的发生:
1、set –o nounset的另一种表达方式:set -u
2、当使用了未初始化的变量时,设置set -o nounset,可以让程序强制退出
当然,上面例子只是为说明问题,脚本可不能这么写,太危险。
让代码执行可追踪
不多说,使用set -o xtrace可达到该目的,将每行的执行命令输出。也可以简写为set -x。常用于调试场景,也可以在执行shell时使用sh -x 的方式调试脚本。
防止错误滚雪球
那么仍然会尝试删除a.txt。
还有另外一种方式也可以达到目的:
1、set -o errexit的另一种表达方式:set -e
4、如果需要让程序即使出错也继续执行,可以在可能出错的语句追加" || true"
学会查路径
1、基于当前脚本执行路径,指定其他路径;
3、让脚本在任何目录下都可以正常执行(脚本中所有位置全部使用决定路径,尽量少使用相对路径;)
巧用shift
上面的func2使用了shift,使得所有命令行参数都可以通过$1读取。再举个更实用的例子:
封装一些常用指令
提供help信息
不多说,脚本最好提供一个help函数,当用户输入参数异常时能够及时给出反馈。
切换目录的几种方式
巧用trap信号
trap func EXIT允许在脚本结束时调用函数,用它注册清理函数。
让脚本可以单独运行任意一个函数
一些额外的小tip
11、shell脚本main函数接收参数时,尽量使用main "$@" 的形式。以下是各种形式传参的结果:
……
你的脚本可以这样开始
后记
shell作为一门很灵活的语言,编写的规范性也越发显得重要。可靠性作为软件质量模型中的第二个特性,很多时候都体现在代码层面。文章稍长,为了加深印象,使用了较多代码段,提到的建议也只是冰山一角,建议感兴趣的读者有机会自己写代码尝试下,也欢迎提出宝贵意见。
golang服务开发平滑升级之优雅重启
全国新型肺炎实时动态
360技术公众号
技术干货|一手资讯|精彩活动
- 如何编写一个shell脚本
- 如何在linux下shell编写脚本中模拟键盘输入
- linux下的shell命令的编写,以及java如何调用linux的shell命令(java如何获取linux上的网卡的ip信息)
- Shell 编程--本文结合大量实例阐述如何编写一个shell脚本
- 转 -- 编写可靠shell脚本的8个建议
- 如何编写一个shell脚本
- Shell 编程--结合大量实例阐述如何编写一个shell脚本
- linux下如何编写shell脚本_2012-12-21
- 一步步教你如何编写Shell脚本
- 如何优雅地编写shell脚本
- 如何编写一个shell脚本
- 如何编写shell脚本
- 如何编写一个shell脚本
- 如何编写一个可靠的linux守护进程
- Shell脚本编写的八条可靠建议(值得收藏)
- 一步步教你如何编写Shell扩展
- Shell 编程--本文结合大量实例阐述如何编写一个shell脚本
- windows下编写的shell脚本如何在Linux运行
- 如何编写一个shell脚本[转]
- 【Linux】如何用shell编写斐波那契函数