Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
BASH初学者要避免的典型陷阱。_Bash_Scripting - Fatal编程技术网

BASH初学者要避免的典型陷阱。

BASH初学者要避免的典型陷阱。,bash,scripting,Bash,Scripting,前几天,我回答了一个问题,在这个问题中,有必要循环浏览给定目录中的所有子词典 作为一名自学成才的bash用户,我很快回答了这个问题。然而,在我的回答中,我使用了$(find…)中的DIR的;做点什么;完成循环子目录。一位彬彬有礼的bash大师指出,如果我继续这样的坏习惯,总有一天会发现自己陷入很多麻烦 在纠正我的答案时,我发现我(尴尬地)还有更多的坏习惯。我在stackoverflow上找不到任何类似的话题,但我确信有很多人和我一样处于“初学者(++)”级别,他们的坏习惯基于“某种程度上有效”的

前几天,我回答了一个问题,在这个问题中,有必要循环浏览给定目录中的所有子词典

作为一名自学成才的bash用户,我很快回答了这个问题。然而,在我的回答中,我使用了$(find…)中的DIR的
;做点什么;完成
循环子目录。一位彬彬有礼的bash大师指出,如果我继续这样的坏习惯,总有一天会发现自己陷入很多麻烦

在纠正我的答案时,我发现我(尴尬地)还有更多的坏习惯。我在stackoverflow上找不到任何类似的话题,但我确信有很多人和我一样处于“初学者(++)”级别,他们的坏习惯基于“某种程度上有效”的方法

我的问题很一般,尽管很简单:

对于使用bash的人来说,要避免哪些重要/有害的陷阱?(如果您发现问题需要一般性回答,我将非常感谢您提供案例的简短描述,并提供文档链接或其他与该主题相关的问题。)

例如,在执行循环编辑文件/目录时,使用全局字符、管道、逻辑符号、简写符号(即
`
)和最后但并非最不重要的将函数应用于不应使用的目的。

我发现非常有启发性。我读了它之后改变了一些旧习惯,它有很多例子

编辑:下面要查看的一些点

  • 使用变量:不使用$设置值,使用$访问
    使用变量时使用${..}避免混淆
  • 使用$()
    旧的语法``会起作用,但很容易出错
  • 避免数组
    您通常并不真正需要它们,而且它们的语法更难
  • #开始(第一行)脚本/bin/bash

    当bash可用时,它将检查并使用bash,当缺少bash时,它将给出一个错误
  • 学习正则表达式
    塞德可以成为你的亲密朋友。即使您只使用
    -e's/../…/g'

    其他实用程序也使用regex
  • 检查不同的可能值时使用case语句
    避免太多,否则嵌套
  • 使用[[…]]测试时,不要跳过if关键字
    if语句已过时,但更易于阅读
  • 不要使用eval
    当你最终理解了语法,你就会知道它是危险的
  • Shell内置的速度更快,但更难阅读
    basename是一个简单的实用程序,但比${fullfile##*/}慢
    也许你应该把便条和一些方便的内置物放在某个地方
  • 向下兼容?
    当您认为有一天您的脚本可能必须使用ksh迁移到Solaris/AIX时,请尝试避免使用特定于bash的语法和Linux实用程序。这将非常困难(sed中的-i标志,find中的附加选项),因此在Solaris/AIX上安装bash可能是一种更好的方法
问题:
例如,在执行循环以编辑文件/dir时,使用全局字符、管道、逻辑符号、简写符号(即“`”),以及最后但并非最不重要的应用函数以达到不应使用它们的目的。

  • 如果有很多脚本使用相同的函数,请将函数存储在common.h之类的文件中
    将此文件包含在
    中。通用.h
  • 了解
    函数xxx{..}
    xxx(){..}
  • 通过标准输出或返回值使用本地变量和返回值

请参阅、和。我不能肯定地说,但我想许多投票率较高的bash标记问题都有可靠的答案(如果没有,也会有关于原因的评论)。下面是一个例子,也许是对您的
find
示例的概括:虽然传统上shell脚本通过外部程序执行各种数据操作,
bash
可以在内部执行许多这样的操作。启动外部项目的成本相对较高;在不需要的地方应该避免。这也是一个很好的开始(我强烈推荐Etan的链接;这一个可能更直接地说明了这一点)。坦白地说,StackOverflow并不是解决此类问题的好地方(它没有一个规范的答案)。感谢您的输入,“mywiki”被添加到书签中:)我当然承认对这个问题的批评,Charles,无论是出于你的原因,还是因为在一天结束的时候,这一切都归结为阅读手册……有些是好的,有些不是那么好。但你并没有真正回答这个问题。这个问题是关于要避免的陷阱,而不是关于风格。虽然这个链接可以回答这个问题,但最好在这里包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,仅链接的答案可能会无效。@Esteric Sigve声明:
如果您发现要回答的问题是一般性的,我希望您提供一个简短的案例描述,并提供文档链接或其他与主题相关的问题。
。他要求一个链接,你是正确的,我应该添加一些亮点。我将添加一些值得关注的要点。