插件窝 干货文章 第三节:Bash编程易犯的错误

第三节:Bash编程易犯的错误

错误 Bash 示例 做法 523    来源:    2025-05-19

Bash编程易犯的错误

Bash脚本编程虽然强大,但也容易犯一些常见错误。以下是Bash编程中容易犯的错误及如何避免它们:

1. 未加引号的变量引用

错误示例

if [ $var = "value" ]; then

问题:当$var为空或包含空格时,会导致语法错误。

正确做法

if [ "$var" = "value" ]; then

2. 忽略错误检查

错误示例

cd /some/directory
rm *

问题:如果cd失败,脚本会在当前目录执行rm *

正确做法

cd /some/directory || exit 1
rm *

3. 使用反引号(`)而不是$()

错误示例

files=`ls *.txt`

问题:反引号难以嵌套且可读性差。

正确做法

files=$(ls *.txt)

4. 忽略shebang行

错误示例

# 直接开始脚本
echo "Hello"

问题:可能导致脚本在不同系统上使用错误的解释器执行。

正确做法

#!/bin/bash
echo "Hello"

5. 在管道中忽略命令失败

错误示例

command1 | command2

问题:即使command1失败,脚本也会继续执行。

正确做法

set -o pipefail
command1 | command2

6. 使用[ ]而不是[[ ]]

错误示例

if [ "$var" = "value" ]; then

问题[ ]是传统test命令,功能有限且容易出错。

正确做法

if [[ $var == "value" ]]; then

7. 忘记变量默认值

错误示例

name=$1
echo "Hello $name"

问题:当用户未提供参数时,脚本行为不可预测。

正确做法

name=${1:-"Guest"}
echo "Hello $name"

8. 在循环中修改迭代变量

错误示例

for file in *.txt; do
    file="${file}.bak"
    # ...
done

问题:修改file不会影响循环的下一次迭代。

正确做法

files=(*.txt)
for i in "${!files[@]}"; do
    files[i]="${files[i]}.bak"
    # ...
done

9. 忽略文件名中的特殊字符

错误示例

for file in *; do
    rm "$file"
done

问题:文件名可能包含空格或特殊字符。

正确做法

find . -maxdepth 1 -type f -exec rm {} +

10. 不使用set -euo pipefail

错误示例

# 没有错误处理设置
command1
command2

问题:脚本会继续执行即使有错误发生。

正确做法

#!/bin/bash
set -euo pipefail
command1
command2

最佳实践总结

  1. 总是引用变量:"$var"
  2. 使用[[ ]]代替[ ]
  3. 使用$()代替反引号
  4. 设置set -euo pipefail
  5. 检查命令返回值
  6. 为脚本参数提供默认值
  7. 处理文件名中的特殊字符
  8. 使用printf代替echo以获得更好的可移植性
  9. 避免解析ls的输出
  10. 使用shellcheck等工具检查脚本

通过避免这些常见错误,可以编写出更健壮、可靠的Bash脚本。