iis服务器助手广告广告
返回顶部
首页 > 资讯 > 操作系统 >linux中Shell脚本编程陷阱有哪些
  • 370
分享到

linux中Shell脚本编程陷阱有哪些

2023-06-16 08:06:36 370人浏览 八月长安
摘要

这篇文章给大家分享的是有关linux中shell脚本编程陷阱有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Shell 脚本很棒,你可以非常轻松地写出有用的东西来。甚至像是下面这个傻瓜式的命令:# 

这篇文章给大家分享的是有关linuxshell脚本编程陷阱有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

Shell 脚本很棒,你可以非常轻松地写出有用的东西来。甚至像是下面这个傻瓜式的命令:

# 用含有 Go 的词汇起名字:$ grep -i ^go /usr/share/dict/* | cut -d: -f2 | sort -R | head -n1goldfish

如果用其他编程语言,就需要花费更多的脑力,用多行代码实现,比如用 Ruby 的话:

puts(Dir['/usr/share/dict/*-english'].map do |f|  File.open(f)    .readlines    .select { |l| l[0..1].downcase == 'go' }end.flatten.sample.chomp)

Ruby 版本的代码虽然不是那么长,也并不复杂。但是 shell 版是如此简单,我甚至不用实际测试就可以确保它是正确的。而 Ruby 版的我就没法确定它不会出错了,必须得测试一下。而且它要长一倍,看起来也更复杂。

这就是人们使用 Shell 脚本的原因,它简单却实用。下面是另一个例子:

curl https://nl.wikipedia.org/wiki/Lijst_van_Nederlandse_gemeenten |    grep '^<li><a href=' |    sed -r 's|<li><a href="/wiki/.+" title=".+">(.+)</a>.*</li>|\1|' |    grep -Ev '(^Tabel van|^Lijst van|Nederland)'

这个脚本可以从维基百科上获取荷兰基层政权的列表。几年前我写了这个临时的脚本,用来快速生成一个数据库,到现在它仍然可以正常运行,当时写它并没有花费我多少精力。但要用 Ruby 完成同样的功能则会麻烦得多。


现在来说说 shell 的缺点吧。随着代码量的增加,你的脚本会变得越来越难以维护,但你也不会想用别的语言重写一遍,因为你已经在这个 shell 版上花费了很多时间。

我把这种情况称为“Shell 脚本编程陷阱”,这是沉没成本谬论的一种特例(LCTT 译注:“沉没成本谬论”是一个经济学概念,可以简单理解为,对已经投入的成本可能被浪费而念念不忘)。

实际上许多脚本会增长到超出预期的大小,你经常会花费过多的时间来“修复某个 bug”,或者“添加一个小功能”。如此循环往复,让人头大。

如果你从一开始就使用 python、Ruby 或是其他类似的语言来写这个程序,你可能会在写***版的时候多花些时间,但以后维护起来就容易很多,bug 也肯定会少很多。

以我的 packman.vim 脚本为例。它起初只包含一个简单的用来遍历所有目录的 for 循环,外加一个 git pull,但在这之后就刹不住车了,它现在有  200 行左右的代码,这肯定不能算是最复杂的脚本,但假如我一上来就按计划用 Go  来编写它的话,那么增加一些像“打印状态”或者“从配置文件里克隆新的 git  库”这样的功能就会轻松很多;添加“并行克隆”的支持也几乎不算个事儿了,而在 shell  脚本里却很难实现(尽管不是不可能)。事后看来,我本可以节省时间,并且获得更好的结果。

出于类似的原因,我很后悔写出了许多这样的 shell 脚本,而我在 2018 年的新年誓言就是不要再犯类似的错误了。

附录:问题汇总

需要指出的是,shell 编程的确存在一些实际的限制。下面是一些例子:

  • 在处理一些包含“空格”或者其他“特殊”字符的文件名时,需要特别注意细节。绝大多数脚本都会犯错,即使是那些经验丰富的作者(比如我)编写的脚本,因为太容易写错了,只添加引号是不够的。

  • 有许多所谓“正确”和“错误”的做法。你应该用 which 还是 command?该用 $@ 还是 $*,是不是得加引号?你是该用 cmd $arg 还是 cmd "$arg"?等等等等。

  • 你没法在变量里存储空字节(0x00);shell 脚本处理二进制数据很麻烦。

  • 虽然你可以非常快速地写出有用的东西,但实现更复杂的算法则要痛苦许多,即使用 ksh/zsh/bash 扩展也是如此。我上面那个解析 html 的脚本临时用用是可以的,但你真的不会想在生产环境中使用这种脚本。

  • 很难写出跨平台的通用型 shell 脚本。/bin/sh 可能是 dash 或者 bash,不同的 shell 有不同的运行方式。外部工具grepsed 等,不一定能支持同样的参数。你能确定你的脚本可以适用于 Linux、MacOS 和 windows 的所有版本吗(无论是过去、现在还是将来)?

  • 调试 shell 脚本会很难,特别是你眼中的语法可能会很快变得记不清了,并不是所有人都熟悉 shell 编程的语境。

  • 处理错误会很棘手(检查 $? 或是 set -e),排查一些超过“出了个小错”级别的复杂错误几乎是不可能的。

  • 除非你使用了 set -u,变量未定义将不会报错,而这会导致一些“搞笑事件”,比如 rm -r ~/$undefined 会删除用户的整个家目录(瞅瞅 GitHub 上的这个悲剧)。

  • 所有东西都是字符串。一些 shell 引入了数组,能用,但是语法非常丑陋和费解。带分数的数字运算仍然难以应付,并且依赖像 bcdc 这样的外部工具($(( .. )) 这种方式只能对付一下整数)。

感谢各位的阅读!关于“linux中Shell脚本编程陷阱有哪些”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

--结束END--

本文标题: linux中Shell脚本编程陷阱有哪些

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

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

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

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

下载Word文档
猜你喜欢
  • linux中Shell脚本编程陷阱有哪些
    这篇文章给大家分享的是有关linux中Shell脚本编程陷阱有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Shell 脚本很棒,你可以非常轻松地写出有用的东西来。甚至像是下面这个傻瓜式的命令:# ...
    99+
    2023-06-16
  • Linux Shell脚本编程的注意事项有哪些
    本篇内容介绍了“Linux Shell脚本编程的注意事项有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、常用技巧代码如下:ssh u...
    99+
    2023-06-09
  • shell脚本编程的规范有哪些
    在编写shell脚本时,可以遵循以下规范:1. 注释:在脚本的开头或相关代码部分添加注释,解释脚本的功能,参数的含义,以及可能的注意...
    99+
    2023-09-22
    shell
  • Linux脚本Shell命令有哪些
    这篇文章将为大家详细讲解有关Linux脚本Shell命令有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.开头程序必须以下面的行开始(必须方在文件的***行):#!/bin/sh符号#!用来告诉系统...
    99+
    2023-06-17
  • JavaScript中this陷阱有哪些
    这篇文章主要为大家展示了“JavaScript中this陷阱有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JavaScript中this陷阱有哪些”这篇文...
    99+
    2024-04-02
  • linux中面试常用Shell脚本有哪些
    小编给大家分享一下linux中面试常用Shell脚本有哪些,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!注意事项1)开头加解释器:#!/bin/bash2)语法缩进,使用四个空格;多加注释说明。3)命名建议规则:变量名大写...
    99+
    2023-06-16
  • 如何编程Linux Shell脚本
    本篇内容介绍了“如何编程Linux Shell脚本”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!从程序员的角度来看, Shell本身是一种用...
    99+
    2023-06-09
  • Linux中执行shell脚本的方法有哪些
    本篇内容介绍了“Linux中执行shell脚本的方法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!bash shell 脚本的方法有多...
    99+
    2023-06-09
  • Linux系统shell脚本基础有哪些
    这篇文章将为大家详细讲解有关Linux系统shell脚本基础有哪些,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。在Linux系统中shell脚本也像解释器一样,但它通常用于调用外部已编译的程...
    99+
    2023-06-28
  • JavaScript中常见的陷阱有哪些
    这篇文章主要讲解了“JavaScript中常见的陷阱有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript中常见的陷阱有哪些”吧!1. ...
    99+
    2024-04-02
  • MYSQL中实用shell脚本有哪些
    小编给大家分享一下MYSQL中实用shell脚本有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! ...
    99+
    2024-04-02
  • Linux Shell脚本面试的题目有哪些
    本篇内容介绍了“Linux Shell脚本面试的题目有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Q:1 Shell脚本是什么、它是必...
    99+
    2023-06-09
  • linux中如何编写shell脚本
    在Linux中,可以使用任何文本编辑器编写Shell脚本。以下是编写Shell脚本的一般步骤: 打开终端并创建一个新的文本文件,...
    99+
    2023-10-23
    linux shell
  • 有哪些有用的Shell脚本
    这篇文章主要讲解了“有哪些有用的Shell脚本”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“有哪些有用的Shell脚本”吧!【例子:001】判断输入为数字,字符或其他代码如下:#!/bin/...
    99+
    2023-06-09
  • linux中Shell脚本编程规范是什么
    这篇文章主要介绍了linux中Shell脚本编程规范是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。代码风格规范开头有“蛇棒”所谓shebang其实就是在很多脚本的第一行...
    99+
    2023-06-15
  • Shell脚本编程:构筑程序基石的基本元素有哪些
    这篇文章主要介绍“Shell脚本编程:构筑程序基石的基本元素有哪些”,在日常操作中,相信很多人在Shell脚本编程:构筑程序基石的基本元素有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,...
    99+
    2024-04-02
  • 如何理解Linux Shell脚本编程
    本篇内容介绍了“如何理解Linux Shell脚本编程”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!通常,当人们提到“shell脚本语言”时...
    99+
    2023-06-09
  • Shell脚本编写的可靠建议有哪些
    今天就跟大家聊聊有关Shell脚本编写的可靠建议有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1. 指定bashshell 脚本的第一行,#!之后应该是什么?如果拿这个问题去问...
    99+
    2023-06-09
  • shell脚本中有哪些特殊符号
    这篇文章主要讲解了“shell脚本中有哪些特殊符号”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“shell脚本中有哪些特殊符号”吧!在shell中常用的特殊符号罗列如下:# ; ;; . ,...
    99+
    2023-06-09
  • Linux的脚本编写方法有哪些
    这篇文章主要介绍了Linux的脚本编写方法有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Linux的脚本编写方法有哪些文章都会有所收获,下面我们一起来看看吧。code 1#!/bin/sh脚本的第一行,看...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作