iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >写shell脚本需要注意哪些事项
  • 328
分享到

写shell脚本需要注意哪些事项

2023-06-27 18:06:15 328人浏览 八月长安
摘要

今天小编给大家分享一下写shell脚本需要注意哪些事项的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1. 指定bashshe

今天小编给大家分享一下写shell脚本需要注意哪些事项的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

写shell脚本需要注意哪些事项

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 命令位于以下情况:

  1. 一个 pipeline 的非结尾部分,比如error | ok
  2. 一个组合语句的非结尾部分,比如ok && error || other
  3. 一连串语句的非结尾部分,比如error; ok
  4. 位于判断语句内,包括test、if、while等等。

这两个组合在一起用,可以在 debug 的时候替你节省许多时间。出于防御性编程的考虑,有必要在写第一行具体的代码之前就插入它们。扪心自问,写代码的时候能够一次写对的次数有多少?大多数代码,在提交之前,通常都经历过反复调试修改的过程。与其在焦头烂额之际才引入这两个配置,不如一开始就给 debug 留下余地。在代码终于可以提交之后,再考虑是否保留它们也不迟。

3. 带上shellcheck

好了,现在我已经有了三行(样板)代码,具体的业务逻辑一行都没写呢。是不是该开始写了? 且慢!工欲善其事,必先利其器。这次,我就介绍一个 shell 脚本编写神器:shellcheck

说来惭愧,虽然写了几年 shell 脚本,有些语法我还是记不清楚。这时候就要依仗 shellcheck 指点一下了。 shellcheck 除了可以提醒语法问题以外,还能检查出 shell 脚本编写常见的 bad code。本来我的N条建议里面,还有几条是关于这些 bad code 的,不过考虑到 shellcheck 完全可以发掘出这些问题,于是忍痛把它们都剔除在外了。毫无疑问,使用 shellcheck 给我的 shell 编写技能带来了巨大的飞跃。

所谓“站在巨人的肩膀上”,虽然我们这些新兵蛋子,技能不如老兵们强,但是我们可以在装备上赶上对方啊!动动手安装一下,就能结识一个循循善诱的“老师”,何乐而不为?顺便一提,shellcheck 居然是用 haskell 写的。谁说 haskell 只能用来装逼?

4. 变量展开

在 shell 脚本中,偶尔可以看到这样的做法:

echo $xxx | awk/sed/grep/cut...

看起来大张形势的样子,其实不过是想修改一个变量的值。杀鸡何必用牛刀?bash内建的变量展开机制已经足以满足你各种需求!还是老方法, read the f**k manaul! man bash然后搜索Parameter Expansion,下面就是你想要的技巧。键者也写过一篇相关的文章,希望能助上一臂之力:玩转Bash变量

5. 注意local

随着代码越写越多,你开始把重复的逻辑提炼成函数。有可能你会掉到bash的一个坑里。在bash,如果不加 local 限定词,变量默认都是全局的。变量默认全局——这跟 jslua 相似;但相较而言,很少有 bash 教程一开始就告知你这个事实。在顶级作用域里,是否是全局变量并不重要。但是在函数里面,声明一个全局变量可能会污染到其他作用域(尤其在你根本没有注意到这一点的情况下)。所以,对于在函数内声明的变量,请务必记得加上 local 限定词。

6. trap信号

如果你写过稍微复杂点的在后台运行的程序,应该知道 posix 标准里面“信号”是什么一回事。如果不知道,直接看下一段。像其他语言一样,shell 也支持处理信号。trap sighandler INT可以在接收到 SIGINT 时调用 sighandler 函数。捕获其他信号的方式以此类推。

不过 trap 的主要应用场景可不是捕获哪个信号。trap命令支持“捕获”许多不同的流程——准确来说,允许用户给特定的流程注入函数调用。其中最为常用的是trap func EXIT和trap func ERR。 trap func EXIT允许在脚本结束时调用函数。由于无论正常退出抑或异常退出,所注册的函数都能得以调用,在需要调用一个清理函数的场景下,我都是用它注册清理函数,而不是简单地在脚本结尾调用清理函数。 trap func ERR允许在运行出错时调用函数。一个常用的技法是,使用全局变量ERROR存储错误信息,然后在注册的函数中根据存储的值完成对应的错误报告。把原本四分五裂的错误处理逻辑集中到一处,有时候会起奇效。不过要记住,程序异常退出时,既会调用EXIT注册的函数,也会调用ERR注册的函数。

7. 三思后行

以上几条都是具体的建议,剩下两条比较务虚。

这条建议的名字叫“三思而行”。其实无论写什么代码,哪怕只是一个辅助脚本,都要三思而行,切忌粗心大意。不,写脚本的时候更要记住这点。毕竟许多时候,一个复杂的脚本发端于几行小小的命令。一开始写这个脚本的人,也许以为它只是一次性任务。代码里难免对一些外部条件有些假定,在当时也许是正常的,但是随着外部环境的变化,这些就成了隐藏的暗礁。雪上加霜的是,几乎没有人会给脚本做测试。除非你去运行它,否则不知道它是否还能正常使用。

要想减缓脚本代码的腐烂速度,需要在编写的时候辨清哪些是会变的依赖、哪些是脚本正常运行所不可或缺的。要有适当的抽象,编写可变更的代码;同时要有防御性编程的意识,给自己的代码一道护城河。

8. 扬长避短

有些时候,使用 shell 写脚本就意味着难以移植、难以统一地进行错误处理、难以利索地处理数据。 虽然使用外部的命令可以方便快捷地实现各种复杂的功能,但作为硬币的反面,不得不依靠grep、sed、awk等各种工具把它们粘合在一起。 如果有兼容多平台的需求,还得小心规避诸如BSD和GNU coreutils,bash版本差异之类奇奇怪怪的陷阱。 由于缺乏完善的数据结构以及一致的api,shell 脚本在处理复杂的逻辑上力不从心。 解决特定的问题要用合适的工具。知道什么时候用 shell,什么时候切换到另外一门更通用的脚本语言(比如ruby/python/perl),这也是编写可靠 shell 脚本的诀窍。如果你的任务可以组合常见的命令来完成,而且只涉及简单的数据,那么 shell 脚本就是适合的锤子。如果你的任务包含较为复杂的逻辑,而且数据结构复杂,那么你需要用ruby/Python之类的语言编写脚本。

以上就是“写shell脚本需要注意哪些事项”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

--结束END--

本文标题: 写shell脚本需要注意哪些事项

本文链接: https://www.lsjlt.com/news/312442.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 写shell脚本需要注意哪些事项
    今天小编给大家分享一下写shell脚本需要注意哪些事项的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1. 指定bashshe...
    99+
    2023-06-27
  • shell脚本打印日期要注意哪些事项
    在编写shell脚本打印日期时,需要注意以下几个事项:1. 选择合适的日期格式:根据需求选择合适的日期格式,例如年-月-日,月/日/...
    99+
    2023-09-14
    shell
  • Linux Shell脚本编程的注意事项有哪些
    本篇内容介绍了“Linux Shell脚本编程的注意事项有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、常用技巧代码如下:ssh u...
    99+
    2023-06-09
  • Bash 脚本编写有哪些需要注意的地方?
    Bash 脚本是一种非常方便的编程语言,可以用于自动化任务、管理系统、实现批处理等多种应用场景。但是,由于 Bash 脚本的语法比较灵活,很容易出现错误,因此编写 Bash 脚本需要注意一些细节,以确保脚本的正确性和可靠性。本文将介绍 B...
    99+
    2023-07-23
    bash leetcode 并发
  • 新网站需要注意哪些事项
    这篇文章主要讲解了“新网站需要注意哪些事项”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“新网站需要注意哪些事项”吧!  第一、网站上内容不足  新上线网站大多都是只有几个或者几十个新做的网页...
    99+
    2023-06-10
  • win7换win10需要注意哪些事项
    本篇内容主要讲解“win7换win10需要注意哪些事项”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“win7换win10需要注意哪些事项”吧!win7换win10需要注意的事项一、BIOS的设置...
    99+
    2023-06-30
  • React中需要注意的事项有哪些
    小编给大家分享一下React中需要注意的事项有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、容器性组件(containe...
    99+
    2024-04-02
  • 网页布局需要注意哪些事项
    这篇文章主要介绍“网页布局需要注意哪些事项”,在日常操作中,相信很多人在网页布局需要注意哪些事项问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”网页布局需要注意哪些事项”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-10
  • 制作网站需要注意哪些事项
    这篇文章将为大家详细讲解有关制作网站需要注意哪些事项,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。第一,尽量使用文字而不是flash、图片、javascript等来显示重要的内容和链接。Aj...
    99+
    2023-06-12
  • 买服务器需要注意哪些事项
    1. 确定需求:在购买服务器之前,需要先确定自己的需求,包括服务器的规模、性能、存储容量、网络带宽等方面。2. 选择合适的规格:根据...
    99+
    2023-06-13
    买服务器 服务器
  • 网站建设需要注意哪些事项
    小编给大家分享一下网站建设需要注意哪些事项,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、网站风格风格(style)是抽象的。是指站点的整体形象给浏览者的综合感受。整体形象包括站点的版面布局,色彩,字体,浏览方式等。每一...
    99+
    2023-06-07
  • 网站改版需要注意哪些事项
    小编给大家分享一下网站改版需要注意哪些事项,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!  一、企业网站为什么要改版  为什么要改版解答了这个问题,也就解答了是不是要改版。这个问题老渔哥玩网络觉得归总起来可以分三个层面: ...
    99+
    2023-06-10
  • 租用日本云服务器需要注意哪些事项
    租用日本云服务器需要注意的事项有:1.选择正规的云服务商,质量高,故障率低;2.正确选择带宽,根据需求选择;3.选择合适的操作系统,Linux和windows;4.选择合适的主机线路,BGP多线路;具体分析如下:选择正规的云服务商好的服务商...
    99+
    2024-04-02
  • 网络域名注册需要注意哪些事项
    1.选择合适的域名后缀:常见的域名后缀有.com、.cn、.net、.org等,需要根据自己的需求选择合适的后缀。2.检查域名是否被...
    99+
    2023-06-06
    网络域名 域名
  • 用php写接口要注意哪些事项
    写接口时需要注意以下几个事项: 安全性:确保接口的安全性,防止非法访问和恶意攻击。可以通过身份验证、访问控制和数据加密等手段来提...
    99+
    2023-10-27
    php
  • 购买服务器需要注意哪些事项
    购买服务器需要注意的事项有:1、注意服务器租用商的选择,选择好的运营商所提供的服务器质量有保障;2、注意服务器的所在区域,如自身业务是在国内,选择租用国内服务器回更好;3、注意服务器配置的选择,包括服务器的内存、CPU、硬盘、带宽、CDN、...
    99+
    2024-04-02
  • 服务器托管需要注意哪些事项
    服务器托管需要注意的事项有:1、注意要有充足的网络及电力资源,以保证网站的访问速度;2、注意要有优秀的维护技术支持,包括数据维护及服务器硬件维护;3、注意服务器的安全策略是否到位,如对防火墙进行合理设置、修复系统漏洞、进行数据备份等;4、注...
    99+
    2024-04-02
  • 使用react框架需要注意哪些事项
    本篇内容主要讲解“使用react框架需要注意哪些事项”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“使用react框架需要注意哪些事项”吧!1.setState到底是同步的还是异步的?class&...
    99+
    2023-06-05
  • 管理VPS主机需要注意哪些事项
    管理VPS主机需要注意的事项:1、需要确定网站的安全性,防止VPS主机被网站漏洞影响;2、需要注意VPS主机主机商的选择,选择专业可靠的主机商,能够帮助用户及时解决VPS主机故障问题;3、需要注意搭建VPS主机系统,根据自身实际情况进行选择...
    99+
    2024-04-02
  • 安装Ubuntu16.04 LTS后需要注意哪些事项
    这篇文章主要讲解了“安装Ubuntu16.04 LTS后需要注意哪些事项”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“安装Ubuntu16.04 LTS后需要注意哪些事项”吧!Ubuntu ...
    99+
    2023-06-27
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作