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 值
有一天我回答了一个问题,其中有必要遍历给定目录中的所有子词典。
作为一个自学成才的 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 值