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

时间:2015-02-13 21:38:52

标签: bash scripting

前几天我回答了一个问题,有必要循环遍历给定目录中的所有子词典。

作为一名自学成才的bash用户,我很快回答了这个问题。但是,在我的回答中,我使用for DIR in $(find ...); do "something"; done来遍历子目录。礼貌的狂欢大师指出,如果我继续这样的坏习惯,总有一天会发现自己遇到很多麻烦。

在纠正我的回答的同时,我发现我(令人尴尬)有更多不良习惯。我在stackoverflow上找不到这样的任何主题,但我确信有很多人喜欢我在#34;初学者(++)"基于"工作类型"。

的方法来处理坏习惯

我的问题是通用的,虽然很简单:

对于使用bash的人来说,要避免哪些重要/有害的陷阱? (如果您发现问题通用回答我会很感激,对案例的简短描述以及文档的链接或其他有关该主题的SO问题表示赞赏。)

E.g。在执行循环编辑文件/目录时,使用globb字符,管道,逻辑,短手记法(即``)和最后但并非最不重要应用函数以达到不应使用的目的

1 个答案:

答案 0 :(得分:0)

我发现Google's Styleguide很有启发性。我在阅读之后改变了一些旧习惯,并且有很多例子。

编辑:下面要注意一些要点。

  • 使用变量:设置不带$的值,使用$
    进行访问 使用变量
  • 时使用$ {..}避免混淆
  • 使用$()在命令行中调用命令 旧的语法``会起作用,但你可以轻易犯错误。
  • 避免阵列
    你通常不需要它们,而且语法更难理解
  • 使用#!/bin/bash开始(第一行)您的脚本 它将在可用时检查并使用bash,并在缺失时给出错误。
  • 学习正则表达式 sed可以成为你的好朋友。即使你只使用-e 's/.../.../g'
    其他实用程序也使用正则表达式。
  • 在检查不同的可能值时使用case语句
    避免过多if-then-else嵌套
  • 使用[[..]]进行测试时,请勿跳过if关键字 if语句已过时但更易于阅读
  • 不要使用eval
    当你终于理解了你将会学到的语法时,它就是危险的。
  • Shell内置更快但更难阅读 basename是一个简单的实用程序,但比$ {fullfile ## * /}更慢 也许你应该在某个地方存放一些便利的内置笔记。
  • 向下兼容?
    如果您认为有一天可能必须使用ksh将脚本迁移到Solaris / AIX,请尝试避免使用特定于bash的语法和Linux实用程序。那将是非常困难的(sed中的-i标志,find中的其他选项)因此在Solaris / AIX上安装bash可能是更好的方法。

问题:E.g. When performing loops to edit files/dirs, using globb characters, pipes, logicals, short hand notation (i.e. ``) and last but not least applying functions for purposes which they should not be used.

  • 如果有许多脚本使用相同的功能,请将这些功能存储在common.h的文件中 将此文件包含在. common.h
  • 了解function xxx {..}xxx() {..}
  • 之间的区别
  • 使用本地var并按stdout或returnvalue返回值