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

Typical pitfalls to avoid for BASH beginners.

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

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

在更正我的答案时,我发现我有(令人尴尬的)更多坏习惯。我在 Whosebug 上找不到任何类似的话题,但我相信有很多像我一样处于 "beginner(++)" 水平的人都有基于 "sort-of-works".

方法的坏习惯

我的问题虽然简单但很笼统:

使用 bash 的人需要避免哪些 important/damaging 陷阱? (如果您发现该问题可以通用回答,我将不胜感激对案例的简短描述 link 文档或关于该主题的另一个 SO 问题。)

例如在执行循环编辑 files/dirs 时,使用 globb 字符、管道、逻辑、简写符号(即 ``)和 最后但并非最不重要的 应用函数的目的不应使用它们。

我发现 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() {..}
  • 之间的区别
  • 通过标准输出或 return 值
  • 使用本地变量和 return 值