“蛇杖”开头:Linux Shell 脚本最佳实践
代码风格定义 “蛇杖”开头
所谓 shebang 就是多个脚本一起出现的第一行“#! “开头的注释表示当我们不指定解释器时默认的解释器。一般来说,它可能看起来像这样:
当然,翻译器有很多种类型。除了bash之外,我们还可以使用下面的命令来查看本机支持的解释器:
当我们直接使用./a.sh执行这个脚本时,如果没有shebang,就会默认为特定的解释器。到 $SHELL,否则它将使用 shebang 定义的解释器。译者。
不过,上面的写法可能不太适应。基本上,我们这样定义:
这就是我们使用的方法。 代码包含注释
当然,注释是常识,但需要再次强调的是,它们在shell脚本中非常重要。由于单个 shell 的命令不容易理解,因此如果不加注释就很难保留。
注释的重要性不仅在于解释如何使用它们,还在于告诉我们要看什么,就像README一样。
其实,对于 shell 脚本来说,注释一般包含以下部分:
- shebang
- 脚本参数
- 脚本目标
- 提前脚本编写时间、作者、版权等。
- 每个函数前的解释性注释
- 更复杂的单行命令注释
这一点很重要。当脚本需要接受令牌时,它必须首先确定令牌是否满足指定的条件,并提供适当的回显,以便用户更容易理解令牌的用法。
最起码要判断参数的个数:
变量和幻数
一般情况下,我们会在一开始就定义一些重要的变量来保证它们的存在。变量。
这种描述方法有一个通用的用法。最常见的应用是,当我们本地安装了多个java版本时,我们可能需要指定使用哪个java。然后我们将在该控件的脚本开头重新定义 JAVA_HOME 和 PATH 变量。
同时,好的代码通常不会将“幻数”硬编码到代码中。如果一定存在的话,一般一开始就定义为变量,然后调用的时候直接调用该变量,方便以后修改。 有缩进规则
对于shell脚本来说,缩进是个大问题。因为很多需要缩进的地方(比如if、for语句)都不是很长,很多人懒得缩进,而且很多人不习惯使用函数,所以缩进功能较弱。
其实,正确的缩进非常重要,尤其是在写作品时,否则阅读时很容易将作品正文与直接命令混淆。
常见的标识方式有两种:“软表”和“硬表”。
- 所谓的软制表符就是使用n个空格进行缩进(n通常为2或4)
- 所谓的硬制表符,当然是指实际的字符“”
Win I这里我不打算采用最好的方法,可以说各有其优点和缺点。反正我已经习惯用硬片了。
对于 if 和 for 语句,then 和关键字最好不要分开写,这样看起来很难看。 。 。
所谓命名规范包括以下几点:
- 定义文件名,以.sh结尾,方便识别。
- 统一方法名称,写shell时一般使用小写字母和下划线
写脚本时尽量使用UTF-8编码,可以支持中文等奇数字符。然而,即使我会写中文,我仍然尝试用英文写评论和日志。毕竟很多机器不直接支持中文,打字会很混乱。
这里需要特别注意的一点是,我们在windows下使用utf-8编码编写shell脚本时,必须检查utf-8是否有BOM。默认情况下,Windows通过在文件开头添加三个EF BB BF字节来定义UTF-8格式,但在Linux上,默认没有BOM。因此,如果我们在Windows下编写脚本,就要考虑将编码改为Utf-8无BOM。一般情况下使用notepad++等编辑器即可编辑。否则,当在Linux下运行时,前三个字符将被识别,导致一些错误,说该命令不被接受。记得添加权限
虽然这是一个小点,但我个人经常忘记,不添加执行权限会导致无法直接执行,这有点烦人。 。 。 日志和回声
不言而喻,日志在大型项目中非常重要,因为它们允许我们返回并纠正错误。
如果这个脚本是想让用户直接在命令行使用的话,我们最好能够在执行过程中实时回放执行过程,方便用人单位监控。
有时候,为了提高用户体验,我们会给回声添加特效,比如颜色、闪电等。有关详细信息,请参阅 ANSI/VT100 控制序列介绍文章。 删除密码
不要在脚本中硬编码密码,不要在脚本中硬编码密码,不要在脚本中硬编码密码。
重要的事情说三遍,尤其是当脚本托管在像 Github 这样的平台上时。 。 。 如果太长,需要用线分隔。为了保证更好的阅读体验,我们可以使用反斜杠来分隔行:
备注返回栏前面有空格。 代码详细说明代码性能
使用命令时,必须了解命令的特殊方法。尤其是当数据处理量较大时,必须时刻考虑是否会影响订单的性能。
例如以下两个sed命令:
它们做同样的事情,它们都获取文件的第一行。但是第一个命令读取整个文件,但第二个命令只读取第一行。当文件很大时,这样不同的命令会导致性能上的巨大差异。
当然,这只是一个例子。此示例的正确用法是使用 head -n1 命令。 。 。 经常使用双引号
几乎所有专家都建议在使用“$”获取变量时使用双引号。
在很多情况下不输入双引号会导致很多问题。为什么?举个例子:
他的手术结果如下:
这是为什么?其实可以解释为他执行的是下面的命令:
很多情况下,使用变量作为参数的时候,一定要考虑到上面的一点,理解其中的区别。上面是一个非常小的例子。在实际操作中,这个细节会带来太多问题。 。 。 巧妙地使用基本函数
我们知道像 Java 和 C 这样的编译语言都可以访问函数。该系统使代码易于阅读。我们知道哪些是实时的,哪些是工作。但剧本不同。该脚本以该语言解释并直接从第一行到最后一行执行。如果把命令和函数结合起来,阅读起来就会非常困难。
Python用户都知道,典型的Python脚本至少是这样的:
它用非常巧妙的方式来实现我们习惯的基本功能,使代码更具可读性。
在shell中,我们也有类似的提示:
我们可以使用这个脚本,实现类似的关键功能,让脚本更有条理。 想想scope
scope变量在shell中是全局的,就像下面的脚本:
输出是2而不是1,这显然不符合套路。-我们容易生到。一些问题。
因此,与其直接使用全局变量,不如使用本地只读之类的命令。其次,我们可以使用语句来声明变量。这些方法比使用全局定义更好。 函数返回值
使用函数时不要忘记小心。 shell中函数的返回值只能是整数。可能是因为函数的返回值通常表示函数运行的状态,一般都是0或者1就可以了,所以就这样做了。但是,如果必须传递字符串,也可以使用以下替代方法:
这样,您可以通过 echo 或 print 传递附加参数。 间接参考值
什么是间接参考?例如以下情况:
我们有一个变量VAR1和一个变量VAR2。 VAR2 的值是 VAR1 的名称。所以现在我们想从 VAR2 中获取 VAR1 的值。我们现在应该做什么?
比较土气的风格如下:
这种用法是可以的,但是看起来不舒服,很难理解。我们不推荐它。实际上,我们不建议使用 eval 命令。
更方便的表示法如下:
可以通过插入 ! 来进行简单的间接引用。在变量名前面。
不过需要注意的是,使用上面描述的方法,我们只能得到一个值,而不能给出一个值。如果要赋值,必须使用eval来显式处理: 正确使用heredocs
所谓heredocs也可以认为是多行输入法,即定义一行。在“
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
code前端网