在GNU / Linux中创建Shell脚本的最佳实践

通常,当您开始 GNU / Linux和/或Unix操作系统的服务器管理区域,人们发现自己(面孔)在通常有 一堆其他管理员写的计划任务 在某个时候,我们必须 管理(管理)解决任何问题,改进和/或消除,以符合机构的新要求 他在哪里工作。 因此,新的 系统管理员 在任何工作场所中,您都面临着一项艰巨的任务,即了解一些 Shell脚本 由其他人创建 旧的SysAdmin,它们的书写方式不佳,或者逻辑或书写结构不易理解,或者在最坏的情况下,它们使用非典型,陈旧,低效的命令或笨拙而混乱的方式编写。

Shell脚本

解决写得不好的脚本 总是一时的烦恼,这教会了任何人 好的SysAdmin 重要的事情。 如果要创建一个 Shell脚本 超越今天,总是更好 用非常专业和标准化的方式写,这样,随着时间的推移,任何其他人或自己都可以 最少的精力和知识即可在最短的时间内实现理解和管理。

因此,经过一系列实用的出版物 “学习Shell脚本” 在这里,我们使用简单和基本的命令来检查一些非常实用的脚本,我们将从这个名为 “在GNU / Linux中创建Shell脚本的最佳实践”, 在此我们将彻底关注它的每个小方面以及许多事情的原因,即,我们将介绍一些技巧,这些技巧将使我们能够编写更好的脚本,但对于我们自己而言并没有那么多,而对于下一个必须这样做的人(SysAdmin)管理他们。 因此,您不必执行繁琐而艰巨的任务来弄清我编写的代码,代码的方式和原因以及为什么它不再起作用。

在这 第一(第一)个帖子 这个新系列 “针对GNU / Linux的良好Shell脚本的最佳实践” 我们将讨论在 Shell脚本标头。

=======================================
标题-外壳的发票
=======================================

#!/路径/解释[parameter-argument]

最上面的是调用GNU / Linux的Shell脚本的基本结构。 其元素可以描述如下:

#! =>沙邦

沙邦(#!) 在已创建或将要创建的脚本的顶部是一个 脚本,该脚本告诉我们的操作系统我们的文件是一组命令,该命令集将由文件后的指示解释器提供(将被解释)。 字符对 #! 实际上,这是一个 幻数 两字节,一个特殊的标记 指定文件类型,就我们而言, 可执行的Shell脚本。 霹雳爆炸后立即出现 要执行的解释器所在的路径以及所述解释器的名称。 换句话说,这是解释脚本中命令的程序的路径,无论是解释器,编程语言还是实用程序。 然后,此Shell执行脚本中的命令,从顶部(shabang的行之后)开始,并忽略所有注释。 一些 沙邦 他们可以是:

#!/ bin / sh的
#!/斌/庆典
#!/ usr / bin / perl
#!/ usr / bin / tcl
#!/ bin / sed -f
#!/ usr / awk -f

上述每行(作为示例)调用一个不同的外壳。 线 / bin / sh的,调用 默认情况下 (在GNU / Linux操作系统上为Bash) 或其他类似。 使用 #!/ bin / sh的,默认值为 伯恩·壳 在大多数基于UNIX的商业版本中,它使脚本创建 可移植到Linux不合适的其他操作系统,但类似或基于它或UNIX,尽管这牺牲了BASH的特定特征。 但是,顺序 “#!/ Bin / sh” 符合规范 POSIX sh标准.

需要注意的是 爆炸中给出的路径必须正确,否则通常是错误消息 “找不到相关命令”,这将是脚本执行的唯一结果。 记住字符对 »#! « 如果脚本仅由一组通用的操作系统命令(即不使用内部Shell指令)组成,则可以将其省略。 并再次记住 »#!/ Bin / sh« 调用默认的shell解释器,默认为 »#!/ Bin / bash« 和他在一起 GNU / Linux操作系统.

关于参数,可以使用几种,但最常见的是: »-E«。 这使得脚本 验证任何命令的执行错误o (执行行),如果为正, 强制停止并退出,典型的是 “-F”指示要加载的脚本 最稀有的之一是 “-R M” 执行完毕后,将其删除。 只能在 沙邦 直到 单参数(参数) 在要执行的程序名称之后。

最后,告诉脚本 您将在代码的基本部分中使用的全局变量,用于验证事件,例如执行路径,授权用户,脚本名称等。 并以 程序,创建者,组织等的数据以及适用于该程序的许可。

我的建议(最佳做法) 选择 最好的沙邦 并前往 Shell脚本 是:

#!/ usr / bin / env bash

为什么使用命令 »环境« 我们向操作系统指示默认情况下将在其中指定的确切路径下使用的解释器,这使我们可以 沙邦 这增加了它的可移植性,因为不是全部 操作系统GNU / Linux 解释器或程序具有相同的路径。 并且没有参数,因为为此,最好使用命令 ,因为有了他,我们可以 验证错误,一般(-e)或特定(+ x / -x), 或者 清除环境(-i)或特定(-u / –unset)变量的全局预设。 最后, 执行特定的(-o)补充行动 在脚本中。

因此,我推荐的HEADER为:

#!/ usr / bin / env bash
#通过操作系统用绝对路径指示bash解释器。

设置-o errexit
#告诉脚本在命令或执行行失败时停止并关闭。

set -o名词集
#告诉脚本在尝试使用未声明的变量时停止并关闭。

设置-o pipefail
#获取最后一个返回非零退出代码的订单的退出状态。

#设置-o xtrace
#跟踪运行情况。 对于调试很有用。 启用它仅检查错误。

请记住要另外遵循以下建议:

01.-缩进您的代码: 使代码具有可读性非常重要,而且很多人似乎也忘记了这一点。 尝试做出必要的缩进以感知可见的良好逻辑结构。

02.-在代码段之间添加空格: 这可以帮助使代码更易于理解,因为按模块或部分隔开可以使代码易于阅读且易于理解。

03.-尽可能注释以下代码: 在每个命令顺序(执行行)或代码部分的顶部(或底部),最好添加对命令序列功能的描述,以解释代码本身发生的情况。

04.-用其功能的描述性名称创建变量: 分配描述性变量名,这些变量显然可以标识将为其创建函数。 即使您创建了永远不会在单个代码块之外使用的临时变量,也最好放置一个隐式地(客观地)说明其处理的值或函数的名称。

05.-使用语法VARIABLE = $(命令)进行命令替换: 如果要创建一个变量的值是从另一个命令派生的,则有两种方法可以在bash中进行操作。 用 反t,即字符 `` , 马凯: VARIABLE =`command -options parameters`,但它已被弃用,因此语法 VARIABLE = $(命令) 这是最现代,接受和推荐的方式。 否->日期=`日期+%F'/是->日期= $(日期+%F)

06.-使用带有或不带有密码的超级用户和授权用户验证模块和/或变量: 必要时提高安全级别。

07.-使用模块和/或操作系统验证变量(发行版,版本,体系结构): 以防止在不合适的平台上使用。

08.-使用模块(过程/部分)来确认关键或批处理操作(模块/功能)的执行情况: 尽量减少因即兴创作或粗心而造成的错误。

09.-提供用户友好界面(用户友好): 通过终端菜单和颜色 对话框具有Zenity,Gxmessage的基本用户的图形界面。 如果可能,请使用声音警报的支持,根据声音识别可识别的事件。 我尝试了尽可能多的脚本 仅通过启用和禁用选项/模块/功能即可双向工作。

10.-包括欢迎和告别模块(消息): 在有必要增加与用户的交互性的情况下。

11.-包括双重执行验证模块: 为其创建一个锁文件,以防止其同时执行超过1次。

12.-使用外部函数和/或模块合理化脚本的大小: 如果脚本很大,则使用函数将代码划分为多个代码,或者将它们划分为小脚本,然后通过一个主脚本调用这些脚本。

13.-以明显的方式调用对脚本中其他解释器(编程语言)的调用: 通过行或模块明确邀请他们。

例如:

# ================================================== #
#!/bin/bash
#Llamando a un interprete externo a BASH
echo 'El siguiente texto será mostrado por el interprete de PERL'
perl -e 'print "Este texto es mostrado por un script PERL embebido.\n";'
exit 0
# ==================================================#
# ==================================================# 
#!/bin/bash #Llamando al interprete de Python. 
echo 'El siguiente es un script de python:'
echo print "Hola, mundo!" | tee $HOME/.testpythonbash.py
python $HOME/.testpythonbash.py exit 0
# ==================================================#

# ======================================================= #
#!/bin/bash
# bash-y-perl.sh

echo "Saludos desde la parte BASH del script."
# Es posible añadir mas comandos BASH aqui.

exit 0
# Fin de la parte BASH del script.

###########################################################

#!/usr/bin/perl
# Esta parte del script se invoca con la opcion -x.

print "Saludos desde la parte PERL del script.\n";
# Podemos añadir mas comandos PERL aqui.

# Fin de la parte PERL del script.
# ======================================================= #
 

在以后的出版物中,我们将更详细地介绍上述每种做法。

而且,如果您知道自己或其他人的一些其他良好做法,请随时评论它们,以制定更完整的纲要!

直到这个新系列的下一个出版物。


发表您的评论

您的电子邮件地址将不会被发表。 必填字段标有 *

*

*

  1. 负责数据:MiguelÁngelGatón
  2. 数据用途:控制垃圾邮件,注释管理。
  3. 合法性:您的同意
  4. 数据通讯:除非有法律义务,否则不会将数据传达给第三方。
  5. 数据存储:Occentus Networks(EU)托管的数据库
  6. 权利:您可以随时限制,恢复和删除您的信息。

  1.   麦克斯·罗德里格斯

    只是一个细节,就是“ shebang”😛
    非常好的职位,从长远来看,好的做法总是有助于标准化。

  2.   一个经过这里的人

    Bash并不是所有发行版中的默认外壳程序,因此/ bin / sh符号链接并不总是指向bash。 例如在Debian中(因此我认为是Ubuntu):
    $ ls -l / bin / sh
    lrwxrwxrwx 1 root root 4 aza 8 2014 / bin / sh->破折号
    因此,Debian上的默认外壳是破折号。 看这里: https://wiki.debian.org/Shell

  3.   无名

    作为了解使用中的Shell的提示:

    回声$ 0
    回声$外壳
    环境 | 壳牌

  4.   Ing。Jose Albert

    你确实是对的! 我在DEBIAN 9和Kali Linux 2.0上进行了测试,这是真的! 带你冲刺。 如果是您要使用的Shell,建议使用以下命令:#!/ Usr / bin / env bash。

    您说得对,这是绝对对的,但是在某些网站(技术文献)上,他们称其为shabang或其他字眼,因此很困惑。 例:

    在计算中,shebang是由脚本开头的字符数字符号和感叹号(#!)组成的字符序列。 也称为sha-bang,[1] [2] hashbang,[3] [4] pound-bang,[5]或hash-pling

    来自: https://en.wikipedia.org/wiki/Shebang_%28Unix%29

    是第二章以沙帮开始
    来自: http://www.tldp.org/LDP/abs/html/sha-bang.html

  5.   Ing。Jose Albert

    另外:basename $ 0