编写可靠Linux shell脚本的八个建议https://yangxx.net/archives/949

1. 指定bash

shell 脚本的第一行,#!之后应该是什么?

如果拿这个问题去问别人,不同的人的回答可能各不相同。我见过/usr/bin/env bash,也见过/bin/bash,还有/usr/bin/bash,还有/bin/sh,还有/usr/bin/env sh。这算是编程界的“’茴’字四种写法”了。

在多数情况下,以上五种写法都是等价的。但是,写过程序的人都知道:“少数情况”里往往隐藏着意想不到的坑。

如果系统的默认 shell 不是 bash 怎么办?比如某 Linux 发行版的某个版本,默认的 sh 就不是 bash。

如果系统的 bash 不是在 /usr/bin/bash 怎么办?

我**推荐使用 /usr/bin/env bash 和 /bin/bash。**前者通过env添加一个中间层,让env在$PATH中搜索bash;后者则是官方背书的,约定俗成的 bash 位置,/usr/bin/bash不过是指向它的一个符号链接。

2. set -e 和 set -x

OK,经过一番讨论,现在第一行定下来了。接下来该开始写第二行了吧?
且慢!在你开始构思并写下具体的代码逻辑之前,先插入一行set -e和一行set -x。

set -x会在执行每一行 shell 脚本时,把执行的内容输出来。它可以让你看到当前执行的情况,里面涉及的变量也会被替换成实际的值。

set -e会在执行出错时结束程序,就像其他语言中的“抛出异常”一样。(准确说,不是所有出错的时候都会结束程序,见下面的注)

注:set -e结束程序的条件比较复杂,在man bash里面,足足用了一段话描述各种情景。大多数执行都会在出错时退出,除非 shell 命令位于以下情况:

一个 pipeline 的非结尾部分,比如 error | ok
一个组合语句的非结尾部分,比如 ok && error || other
一连串语句的非结尾部分,比如 error; ok
位于判断语句内,包括 test、if、 while 等等。
这两个组合在一起用,可以在 debug 的时候替你节省许多时间。出于防御性编程的考虑,有必要在写第一行具体的代码之前就插入它们。扪心自问,写代码的时候能够一次写对的次数有多少?大多数代码,在提交之前,通常都经历过反复调试修改的过程。与其在焦头烂额之际才引入这两个配置,不如一开始就给 debug 留下余地。在代码终于可以提交之后,再考虑是否保留它们也不迟。

编写可靠Linux shell脚本的建议相关推荐

  1. linux 的脚本编写的,linux shell脚本编写兄弟书

    贝泽陶夫: '--------------------------------------------------------------------------------------------- ...

  2. 在linux中编写shell脚本文件,如何编写简单的Shell脚本(Script)文件之Linux的基本操作...

    如何编写简单的Shell脚本(Script)文件之Linux的基本操作 新建一个文本文件包含所需要的脚本.举例,我会使用pico编辑器写一个脚本用来运行程序tar,带上必要的可选项可以用来解压从因特网 ...

  3. Linux编写脚本nsum求和,详解Linux Shell脚本编写技巧,附实例说明

    原标题:详解Linux Shell脚本编写技巧,附实例说明 Linux Shell是一个很难的知识板块.虽然大家都认真学,基本的语法很都掌握,但有需求时,很难直接上手编程,要么写了很久,要么写不好!对 ...

  4. 编写 Linux shell 脚本 踩坑记录

    几年前,抽出一段时间学习了Linux Shell 脚本的学习,用于自动化项目的自动化发布. 如今,几年过去了,忘记的差不多了. 前几天刚写了一个脚本,漏洞百出,将踩过的坑再次记录下来,提醒自己. 1. ...

  5. LINUX SHELL脚本攻略笔记[速查]

    LINUX SHELL脚本攻略笔记[速查] Linux Shell脚本攻略笔记[速查] 资源 shell script run shell script echo printf 环境变量和变量 pgr ...

  6. Linux shell脚本基础学习

    Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提. 1. Li ...

  7. Linux shell脚本基础学习详细介绍(完整版)一

    Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提. 1. Li ...

  8. Linux shell脚本基础学习详细介绍(完整版)

    Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提. 1. Li ...

  9. 批量ping脚本shell_30个Linux Shell脚本经典案例(上)

    在学习Linux运维时,普遍反馈是:Linux Shell是一个很难的知识板块.虽然大家都认真学,基本的语法也都掌握了,但有需求时,很难直接上手编程,要么写了很久,要么写不好! 也有很多做运维很多年的 ...

最新文章

  1. ARM研发进展与企业清单
  2. python外部库是什么_如何使用Portable Python安装外部库?
  3. qt如何把父窗口的变量传给子窗口_父窗口和iframe子窗口之间相互传递参数和调用函数或方法...
  4. 马化腾又要发红包!648亿港元,最多腾讯2%股份,我酸了...
  5. WinMerge只显示差异部分的设置方法
  6. H.264简单码流分析
  7. 图解:怎么样安装TortoiseSVN以及汉化
  8. linux pagecache与内存占用
  9. mysql的语句大全_mysql语句大全
  10. (图文教程)帝国cms7.0列表页模板调用多说评论次数
  11. 2021Q2产品团队绩效总结--管理日记
  12. Notes from Google Play | Google Play 持续助力您的应用和游戏
  13. 自定义竖向SeekBar (VerticalSeekBar)
  14. 【工具使用】go build 命令打包成exe
  15. 加强版Apktool堪称逆向神器
  16. Anaconda/pip 更换阿里源,助力 conda create -n 虚拟环境搭建
  17. 魔兽怀旧服联盟服务器不稳定,魔兽世界怀旧服转服服务关闭最后一天,联盟部落新的对抗...
  18. 使用libcurl库把域名转化IP
  19. linux 网络优化 net.ipv4.tcp_tw_recycle 简介
  20. 【c语言入门】有10个学生,每个学生的数据包含学号、姓名、3门课的成绩,从键盘输入10个学生的数据,要求打印输出3门课程的总平均成绩。

热门文章

  1. python语言的变量特点随时_【Python】Python语言特点
  2. qt5.4 for android,windows下Qt5.4.2 for android开发环境配置
  3. vscode二次开发_vscode 扩展开发从入门到颈椎病康复
  4. everything下载哪个版本_Everything敏感信息泄露
  5. VS2012下基于Glut OpenGL GL_POLYGON_STIPPLE示例程序:
  6. IOS开发-我的第一个IOS程序
  7. 案例:需求问题的解决方案
  8. Bootstrap3基础 glyphicon 设置图标的颜色与大小
  9. python的编码规范【摘】
  10. XCode各种告警处理