[Shell]bash的良好编码实践
最好的bash脚本不仅可以工作,而且以易于理解和修改的方式编写。很多好的编码实践都是来自使用一致的变量名称和一致的编码风格。验证用户提供的参数是否正确,并检查命令是否能成功运行,以及长时间运行是否能保持可用性。下面分享一下我的工作技巧。
1. 使用良好的缩进
使用良好的缩进能使代码可读性更好,从而能更好的维护。
当你有三级以上的逻辑时,缩进能使我们轻松的查看脚本的整体逻辑。使用多少个空格缩进并不重要,尽管大多数人更多的使用4个空格或8个空格进行缩进。
#!/bin/bash
if [ $# -ge 1 ] && [ -d $1 ]; then
  for file in `ls $1`
    do
        if [ $debug == "on" ]; then
            echo working on $file
         fi
         wc -l $1/$file
      done
else
  echo "USAGE: $0 directory"
    exit 1
fi
2. 提供使用说明
使用帮助语句可以帮助使用者运行脚本,即使两年后你自己也能知道脚本需要提供什么参数
#!/bin/bash
if [ $# == 0 ]; then
    echo "Usage: $0 filename"
    exit 1
fi
3. 使用合理的注释
提供说明你代码的注释,特别是当代码很复杂时,但也没有必要解释意图很明显的代码.解释你所使用的每一个命令,或组合中重要的命令。
#!/bin/bash
username=$1
# make sure the account exists on the system
grep ^$username: /etc/passwd
if [ $? != 0 ]; then
    echo "No such user: $username"
    exit 1
fi
4. 出现问题时使用返回码退出
当代码中出现问题时返回一个非0返回码,即使你自己不会看,但这也是一个好主意。假设有一天,你可能需要一个简单的方法来检查脚本中出现的问题,返回代码为1或4或11可能会帮助你快速找出问题。
#!/bin/bash
echo -n "In what year were you born?> "
read year
if [ $year -gt `date +%Y` ]; then
    echo "Sorry, but that's just not possible."
    exit 2
fi
5. 使用函数而不是重复一组命令
函数也可以使你的代码具有更好的可读性以及更易于维护。如果只是重复使用一个命令,没有必要使用函数,但是如果很简单的就能区分开一些常用的命令(separate a handful of focused commands),使用函数这是值得的。如果以后对此进行更改,你只需要在一个地方进行更改。
#!/bin/bash
function lower()
{
    local str="$@"
    local output
    output=$(tr '[A-Z]' '[a-z]'<<<"${str}")
    echo $output
}
6. 赋予变量有意义的名字
Unix管理员通常会尽最大努力的避免输入一些额外的字符,但不要在脚本中这样操作。花费一点时间为变量提供有意义的名称,并在命名时保持一致性。
#!/bin/bash
if [ $# != 1 ]; then
    echo "Usage: $0 address"
    exit 1
else
    ip=$1
fi
7. 检查参数是否是正确类型
如果在使用参数之前检查以确保提供给脚本的参数是符合预期类型的,那么可以节省很多麻烦。下面是一种简单检查参数是否为数字的方法:
#!/bin/bash
if ! [ "$1" -eq "$1" 2> /dev/null ]
then
  echo "ERROR: $1 is not a number!"
  exit 1
fi
8. 检查参数是否缺失或者顺序错误
如果提供一个以上的参数,最好要确认一下。
#!/bin/bash
if [ $# != 3 ]; then
    echo "What part of THREE ARGUMENTS don't you understand?"
fi
9. 检查需要的文件是否存在
在使用某个文件之前,很容易检查该文件是否存在。下面是一个简单的检查,来查看第一个参数指定的文件是否实际存在。
#!/bin/bash
if [ ! -f $1 ]; then
    echo "$1 -- no such file"
fi
10. 命令输出发送到/dev/null
将命令输出发送到/dev/null,并以更加“友好”的方式告诉用户出了什么问题,可以让你的脚本更容易的运行。
#!/bin/bash
if [ $1 == "help" ]; then
    echo "Sorry -- No help available for $0"
else
    CMD=`which $1 >/dev/null 2>&1`
    if [ $? != 0 ]; then
        echo "$1: No such command -- maybe misspelled or not on your search path"
        exit 2
    else
        cmd=`basename $1`
        whatis $cmd
    fi
fi
11. 充分利用错误代码
可以在脚本中使用返回码来确定命令是否得到预期的结果。
#!/bin/bash
# check if the person is still logged in or has running processes
ps -U $username 2> /dev/null
if [ $? == 0 ]; then
    echo "processes:" >> /home/oldaccts/$username
    ps -U $username >> /home/oldaccts/$username
fi
12. 给予反馈
不要忘记告诉运行你的脚本人需要知道什么。他们不必阅读代码就可以提醒他们为其创建文件的位置 - 特别是如果它不在当前目录中。
...
date >> /tmp/report$$
echo "Your report is /tmp/report$$"
13. 引号与扩展参数
如果你正在使用脚本中扩展的字符,不要忘记使用引号,这样就不会得到与预期不同的结果。
#!/bin/bash
msg="Be careful to name your files *.txt"
# this will expand *.txt
echo $msg # Be careful to name your files behavior_20170728.txt exception.txt
# this will not
echo "$msg" # Be careful to name your files *.txt
14. 使用$@引用所有参数
$@变量列出了提供给脚本的所有参数:
#!/bin/bash
for i in "$@"
do
    echo "$i"
done
原文:http://www.networkworld.com/article/2694433/unix-good-coding-practices-for-bash.html
[Shell]bash的良好编码实践的更多相关文章
- linux shell & bash
		shell & bash shell指允许用户通过文本操作计算机的程序. interactive shell:从是否通过标准输入输出与用户进行交互的角度分为交互式shell(interacti ... 
- shell/bash 让vi/vim显示空格,及tab字符
		shell/bash 让vi/vim显示空格,及tab字符 Vim 可以用高亮显示空格和TAB.文件中有 TAB 键的时候,你是看不见的.要把它显示出来::set listTAB 键显示为 ^I, ... 
- Linux编程环境介绍(2) -- shell(Bash) 介绍
		1. 在计算机科学中,Shell俗称壳(用来区别于核),是指“提供使用者使用界面”的软件(命令解析器).它类似于DOS下的command和后来的cmd.exe. 2. bash (Bourne Aga ... 
- 什么是shell? bash和shell有什么关系?
		什么是shell? bash和shell有什么关系? 博客分类: Linux 什么是Shell? shell是你(用户)和Linux(或者更准确的说,是你和Linux内核)之间的接口程序 ... 
- 20181225-Linux Shell Bash环境下自动化创建ssh互信脚本
		20181225-Linux Shell Bash环境下自动化创建ssh互信脚本 1. 我的Blog 博客园 https://www.cnblogs.com/piggybaba/ 个人网站 http: ... 
- CMD & Git Shell & Bash Shell
		CMD & Git Shell & Bash Shell https://mvdan.cc/sh/cmd/shfmt PC 
- Kafka项目实战-用户日志上报实时统计之编码实践
		1.概述 本课程的视频教程地址:<Kafka实战项目之编码实践> 该课程我以用户实时上报日志案例为基础,带着大家去完成各个KPI的编码工作,实现生产模块.消费模块,数据持久化,以及应用调 ... 
- ElasticSearch实战-编码实践
		1.概述 前面在<ElasticSearch实战-入门>中给大家分享如何搭建这样一个集群,在完成集群的搭建后,今天给大家分享如何实现对应的业务功能模块,下面是今天的分享内容,目录如下所示: ... 
- Hadoop项目实战-用户行为分析之编码实践
		1.概述 本课程的视频教程地址:<用户行为分析之编码实践> 本课程以用户行为分析案例为基础,带着大家去完成对各个KPI的编码工作,以及应用调度工作,让大家通过本课程掌握Hadoop项目的编 ... 
随机推荐
- 北京电子科技学院(BESTI)实验报告2
			北京电子科技学院(BESTI)实验报告2 课程: 信息安全系统设计基础 班级:1452.1453 姓名:(按贡献大小排名)郑凯杰 .周恩德 学号:(按贡献大小排名)20145314 .20145217 ... 
- 20145329 《JAVA程序设计》实验三总结
			实验日期:2016.4.12 实验时间:15:30~17:30 实验序号:实验三 实验名称: 敏捷开发与XP实践 实验目的与要求: XP基础 XP核心实践 相关工具 实验内容 1.使用git托管代码 ... 
- 如何快速生成openwrt的差异配置项
			答:./script/diff > defconfig 那么如何恢复添加的配置项呢? step 1:cat defconfig>>.config step 2:make defcon ... 
- Codeforces - 828E DNA Evolution —— 很多棵树状数组
			题目链接:http://codeforces.com/contest/828/problem/E E. DNA Evolution time limit per test 2 seconds memo ... 
- linux 卸载jdk和安装
			卸载JDK 1.先输入java -version 查看是否安装了jdk 2.如果安装了,检查下安装的路径 which java(查看JDK的安装路径) 3.卸载 rm -rf JDK地址(卸载JDK) ... 
- 数据结构——堆(Heap)大根堆、小根堆
			目录 Heap是一种数据结构具有以下的特点: 1)完全二叉树: 2)heap中存储的值是偏序: Min-heap: 父节点的值小于或等于子节点的值: Max-heap: 父节点的值大于或等于子节点的值 ... 
- 素数分布 - nefu 117
			素数个数的位数 - nefu 117 普及一个公式: 位数公式:要求一个数x的位数,用公式:lg(x)+1 素数分布:n/ln(n) 所以直接求解n/ln(n)的位数就可以了 代码如下: #inclu ... 
- 转载:Service Mesh:重塑微服务市场--敖小剑
			转载地址:https://skyao.io/talk/201805-service-mesh-rebuild-microservice-market/ 重点: 不要太过关注 Service Mesh ... 
- 机器学习笔记—EM 算法
			EM 算法所面对的问题跟之前的不一样,要复杂一些. EM 算法所用的概率模型,既含有观测变量,又含有隐变量.如果概率模型的变量都是观测变量,那么给定数据,可以直接用极大似然估计法,或贝叶斯估计法来估计 ... 
- PHP中用下划线开头的含义
			命名的规则 加一个为私有的 加两个一般都是系统默认的,系统预定义的,即所谓:=====================“魔术方法”与“魔术常量”=====================★PHP起止为 ... 
