51学通信论坛2017新版

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2647|回复: 0
打印 上一主题 下一主题

Linux 中高效编写 Bash 脚本的 10 个技巧

[复制链接]

 成长值: 15613

  • TA的每日心情
    开心
    2022-7-17 17:50
  • 2444

    主题

    2544

    帖子

    7万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    74104
    跳转到指定楼层
    楼主
    发表于 2017-11-15 15:19:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


    Shell 脚本编程 是你在 Linux 下学习或练习编程的最简单的方式。尤其对 系统管理员要处理着自动化任务,且要开发新的简单的实用程序或工具等(这里只是仅举几例)更是必备技能。 -- Aaron Kili
    本文导航

      -1、 脚本中多写注释 …… 08%
      -2、 当运行失败时使脚本退出 …… 15%
      -3、 当 Bash 用未声明变量时使脚本退出 …… 21%
      -4、 使用双引号来引用变量 …… 26%
      -5、 在脚本中使用函数 …… 41%
      -6、 字符串比较时用 = 而不是 == …… 49%
      -7、 用 $(command) 而不是老旧的 `command` 来做代换 …… 55%
      -8、 用 readonly 来声明静态变量 …… 65%
      -9、 环境变量用大写字母命名,而自定义变量用小写 …… 69%
      -10、 总是对长脚本进行调试 …… 76%
    编译自: https://www.tecmint.com/useful-tips-for-writing-bash-scripts-in-linux/
    作者: Aaron Kili
    译者: ch-cn

    Shell 脚本编程 是你在 Linux 下学习或练习编程的最简单的方式。尤其对 系统管理员要处理着自动化任务[1],且要开发新的简单的实用程序或工具等(这里只是仅举几例)更是必备技能。
    本文中,我们将分享 10 个写出高效可靠的 bash 脚本的实用技巧,它们包括:
    1、 脚本中多写注释

    这是不仅可应用于 shell 脚本程序中,也可用在其他所有类型的编程中的一种推荐做法。在脚本中作注释能帮你或别人翻阅你的脚本时了解脚本的不同部分所做的工作。
    对于刚入门的人来说,注释用 # 号来定义。
    # TecMint 是浏览各类 Linux 文章的最佳站点

    2、 当运行失败时使脚本退出

    有时即使某些命令运行失败,bash 可能继续去执行脚本,这样就影响到脚本的其余部分(会最终导致逻辑错误)。用下面的行的方式在遇到命令失败时来退出脚本执行:
    # 如果命令运行失败让脚本退出执行
    set -o errexit
    # 或
    set -e

    3、 当 Bash 用未声明变量时使脚本退出

    Bash 也可能会使用能导致起逻辑错误的未声明的变量。因此用下面行的方式去通知 bash 当它尝试去用一个未声明变量时就退出脚本执行:
    # 若有用未设置的变量即让脚本退出执行
    set -o nounset
    # 或
    set -u

    4、 使用双引号来引用变量

    当引用时(使用一个变量的值)用双引号有助于防止由于空格导致单词分割开和由于识别和扩展了通配符而导致的不必要匹配。
    看看下面的例子:
    #!/bin/bash
    # 若命令失败让脚本退出
    set -o errexit
    # 若未设置的变量被使用让脚本退出
    set -o nounset
    echo "Names without double quotes"
    echo
    names="Tecmint FOSSMint Linusay"
    for name in $names; do
    echo "$name"
    done
    echo
    echo "Names with double quotes"
    echo
    for name in "$names"; do
    echo "$name"
    done
    exit 0

    保存文件并退出,接着如下运行一下:
    $ ./names.sh

    在脚本中用双引号


    5、 在脚本中使用函数

    除了非常小的脚本(只有几行代码),总是记得用函数来使代码模块化且使得脚本更可读和可重用。
    写函数的语法如下所示:
    function check_root(){
    command1;
    command2;
    }
    # 或
    check_root(){
    command1;
    command2;
    }

    写成单行代码时,每个命令后要用终止符号:
    check_root(){ command1; command2; }

    6、 字符串比较时用 = 而不是 ==

    注意 == 是 = 的同义词,因此仅用个单 = 来做字符串比较,例如:
    value1=”tecmint.com”
    value2=”fossmint.com”
    if [ "$value1" = "$value2" ]

    7、 用 $(command) 而不是老旧的 `command` 来做代换

    命令代换[2] 是用这个命令的输出结果取代命令本身。用 $(command) 而不是引号 `command` 来做命令代换。
    这种做法也是 shellcheck tool[3] (可针对 shell 脚本显示警告和建议)所建议的。例如:
    user=`echo “$UID”`
    user=$(echo “$UID”)

    8、 用 readonly 来声明静态变量

    静态变量不会改变;它的值一旦在脚本中定义后不能被修改:
    readonly passwd_file=”/etc/passwd”
    readonly group_file=”/etc/group”

    9、 环境变量用大写字母命名,而自定义变量用小写

    所有的 bash 环境变量用大写字母去命名,因此用小写字母来命名你的自定义变量以避免变量名冲突:
    # 定义自定义变量用小写,而环境变量用大写
    nikto_file=”$HOME/Downloads/nikto-master/program/nikto.pl”
    perl “$nikto_file” -h “$1”

    10、 总是对长脚本进行调试

    如果你在写有数千行代码的 bash 脚本,排错可能变成噩梦。为了在脚本执行前易于修正一些错误,要进行一些调试。通过阅读下面给出的指南来掌握此技巧:

      如何在 Linux 中启用 Shell 脚本调试模式[4]
      如何在 Shell 脚本中执行语法检查调试模式[5]
      如何在 Shell 脚本中跟踪调试命令的执行[6]

    本文到这就结束了,你是否有一些其他更好的 bash 脚本编程经验想要分享?若是的话,在下面评论框分享出来吧。
    作者简介:
    Aaron Kili 是一个 Linux 和 F.O.S.S(Free and Open-Source Software,自由及开放源代码软件)爱好者,未来的 Linux 系统管理员、Web 开发人员,目前是 TecMint 的内容创作者,他喜欢用电脑工作,且崇尚分享知识。
    via: https://www.tecmint.com/useful-tips-for-writing-bash-scripts-in-linux/
    作者:Aaron Kili[7] 译者:ch-cn 校对:wxy
    本文由 LCTT 原创编译,Linux中国 荣誉推出

      [1]: 系统管理员要处理着自动化任务 - https://www.tecmint.com/using-shell-script-to-automate-linux-system-maintenance-tasks/
      [2]: 命令代换 - https://www.tecmint.com/assign-linux-command-output-to-variable/
      [3]: shellcheck tool - https://www.tecmint.com/shellcheck-shell-script-code-analyzer-for-linux/
      [4]: 如何在 Linux 中启用 Shell 脚本调试模式 - https://linux.cn/article-8028-1.html
      [5]: 如何在 Shell 脚本中执行语法检查调试模式 - https://linux.cn/article-8045-1.html
      [6]: 如何在 Shell 脚本中跟踪调试命令的执行 - https://linux.cn/article-8120-1.html
      [7]: Aaron Kili - https://www.tecmint.com/author/aaronkili/


    声明:本文转载自网络。版权归原作者所有,如有侵权请联系删除。
    扫描并关注51学通信微信公众号,获取更多精彩通信课程分享。

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    Archiver|手机版|小黑屋|51学通信技术论坛

    GMT+8, 2025-1-31 13:09 , Processed in 0.073827 second(s), 32 queries .

    Powered by Discuz! X3

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表