[Shell]bash的良好编码实践

简介: 最好的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

目录
相关文章
|
6月前
|
移动开发 Shell Linux
百度搜索:蓝易云【Shell错误:/bin/bash^M: bad interpreter: No such file or directory】
将 `your_script.sh`替换为你的脚本文件名。运行此命令后,脚本文件的换行符将被转换为Linux格式,然后就可以在Linux系统上正常执行脚本了。
75 8
|
6月前
|
存储 Shell Linux
【Shell 命令集合 备份压缩 】Linux 解码uuencode编码的文件 uudecode 命令 使用指南
【Shell 命令集合 备份压缩 】Linux 解码uuencode编码的文件 uudecode 命令 使用指南
83 0
|
2月前
|
Unix Shell Windows
随笔:What is Bash? What is shell?
随笔:What is Bash? What is shell?
|
6月前
|
Linux Shell 文件存储
【Linux技术专题】「夯实基本功系列」带你一同学习和实践操作Linux服务器必学的Shell指令(深入df和dh的区别和探索)
【Linux技术专题】「夯实基本功系列」带你一同学习和实践操作Linux服务器必学的Shell指令(深入df和dh的区别和探索)
190 1
|
3月前
|
缓存 Shell Linux
在Linux中,bash shell 中的 hash 命令有什么作用?
在Linux中,bash shell 中的 hash 命令有什么作用?
|
3月前
|
Shell Linux
在Linux中,使用bash shell实现条件判断和循环结构的例子是什么样的?
在Linux中,使用bash shell实现条件判断和循环结构的例子是什么样的?
|
6月前
|
监控 Linux Shell
【Linux技术专题】「夯实基本功系列」带你一同学习和实践操作Linux服务器必学的Shell指令(排查问题指令 - 下)
在线上排查问题时,查询日志、查看系统配置和分析操作系统信息是至关重要的。这些操作可以帮助我们深入了解软件和服务的兼容性,并解决潜在的问题。在本次学习中,我们将介绍并深入学习一些我在处理类似问题时常用的指令。通过掌握这些指令,你将能够更加高效地定位和解决线上问题,提高系统的稳定性和性能。让我们一同进入这个学习过程吧!
82 0
【Linux技术专题】「夯实基本功系列」带你一同学习和实践操作Linux服务器必学的Shell指令(排查问题指令 - 下)
|
5月前
|
Shell 开发者
Shell 函数深入解析与实践
了解 Shell 函数的基础,包括定义、参数传递及返回值。函数定义有多种语法,如 `function func() {...}` 或 `func() {...}`。参数通过 `$1`, `$2` 等访问,`$@` 代表所有参数。`return` 用于返回退出状态码(0-255),非数值数据需用 `echo`。正确获取函数返回值应立即检查 `$?`,例如:`result=$?`。实践中不断探索和学习!
38 1
|
6月前
|
监控 关系型数据库 Shell
Shell脚本入门:从基础到实践,轻松掌握Shell编程
Shell脚本入门:从基础到实践,轻松掌握Shell编程
132 3
|
6月前
|
Shell Linux
【Linux】进程实践项目(更新中) — 自主shell编写
前几篇文章,我们学习进程的相关知识:进程概念,进程替换,进程控制。熟悉了进程到底是个什么事情,接下来我们来做一个实践,来运用我们所学的相关知识。这个项目就是手搓一个shell模块,模拟实现Xshell中的命令行输入。
65 1
下一篇
无影云桌面