BASH初学者要避免的典型陷阱。
前几天,我回答了一个问题,在这个问题中,有必要循环浏览给定目录中的所有子词典 作为一名自学成才的bash用户,我很快回答了这个问题。然而,在我的回答中,我使用了$(find…)中的DIR的BASH初学者要避免的典型陷阱。,bash,scripting,Bash,Scripting,前几天,我回答了一个问题,在这个问题中,有必要循环浏览给定目录中的所有子词典 作为一名自学成才的bash用户,我很快回答了这个问题。然而,在我的回答中,我使用了$(find…)中的DIR的;做点什么;完成循环子目录。一位彬彬有礼的bash大师指出,如果我继续这样的坏习惯,总有一天会发现自己陷入很多麻烦 在纠正我的答案时,我发现我(尴尬地)还有更多的坏习惯。我在stackoverflow上找不到任何类似的话题,但我确信有很多人和我一样处于“初学者(++)”级别,他们的坏习惯基于“某种程度上有效”的
;做点什么;完成
循环子目录。一位彬彬有礼的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(){..}
- 通过标准输出或返回值使用本地变量和返回值
find
示例的概括:虽然传统上shell脚本通过外部程序执行各种数据操作,bash
可以在内部执行许多这样的操作。启动外部项目的成本相对较高;在不需要的地方应该避免。这也是一个很好的开始(我强烈推荐Etan的链接;这一个可能更直接地说明了这一点)。坦白地说,StackOverflow并不是解决此类问题的好地方(它没有一个规范的答案)。感谢您的输入,“mywiki”被添加到书签中:)我当然承认对这个问题的批评,Charles,无论是出于你的原因,还是因为在一天结束的时候,这一切都归结为阅读手册……有些是好的,有些不是那么好。但你并没有真正回答这个问题。这个问题是关于要避免的陷阱,而不是关于风格。虽然这个链接可以回答这个问题,但最好在这里包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,仅链接的答案可能会无效。@Esteric Sigve声明:如果您发现要回答的问题是一般性的,我希望您提供一个简短的案例描述,并提供文档链接或其他与主题相关的问题。
。他要求一个链接,你是正确的,我应该添加一些亮点。我将添加一些值得关注的要点。