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

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

错误 Bash 示例 引号 212    来源:    2025-05-18

Bash编程易犯的错误

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

1. 变量引用错误

错误示例

name = "John"  # 等号两边有空格
echo $name    # 当变量值包含空格时会出问题

正确做法

name="John"   # 等号两边不能有空格
echo "$name"  # 总是用引号包裹变量引用

2. 条件判断错误

错误示例

if [ $var == "value" ]; then  # 当$var为空时语法错误

正确做法

if [ "$var" = "value" ]; then  # 使用=而不是==,变量加引号

3. 整数比较错误

错误示例

if [ $a > $b ]; then  # 这是字符串比较,且>会被解释为重定向

正确做法

if [ $a -gt $b ]; then  # 使用-gt进行整数比较
# 或者
if (( a > b )); then    # 使用算术表达式

4. 命令替换问题

错误示例

for file in `ls *.txt`; do  # 无法处理文件名中的空格

正确做法

for file in *.txt; do       # 直接使用通配符
# 或者
while IFS= read -r -d '' file; do  # 处理复杂文件名
    find . -name '*.txt' -print0
done

5. 管道中的变量作用域

错误示例

count=0
cat file.txt | while read line; do
    ((count++))
done
echo $count  # 输出0,因为管道创建了子shell

正确做法

count=0
while read line; do
    ((count++))
done < file.txt
echo $count  # 正确计数

6. 未处理错误

错误示例

cd /some/directory
rm *.tmp

正确做法

cd /some/directory || exit 1
rm *.tmp

7. 引号嵌套问题

错误示例

echo "当前日期是: `date`"  # 反引号在双引号中

正确做法

echo "当前日期是: $(date)"  # 使用$()替代反引号

8. 数组处理错误

错误示例

arr=(one two three)
echo $arr  # 只输出第一个元素

正确做法

arr=(one two three)
echo "${arr[@]}"  # 输出所有元素

9. 未设置安全选项

错误示例

#!/bin/bash
# 没有设置任何安全选项
rm -rf "$dir/*"  # 如果dir未设置会删除根目录

正确做法

#!/bin/bash
set -euo pipefail  # 启用错误退出、未设置变量报错、管道错误检测
rm -rf "${dir:?}/*"  # 如果dir未设置或为空会报错

10. 路径拼接错误

错误示例

path="$HOME/myfolder"
file="$path/file.txt"  # 如果path以/结尾会有两个斜杠

正确做法

path="$HOME/myfolder"
file="${path%/}/file.txt"  # 移除可能的尾部斜杠

最佳实践建议

  1. 总是使用 #!/bin/bash#!/usr/bin/env bash 作为shebang
  2. 为变量引用添加双引号:"$var"
  3. 使用 [[ ]] 代替 [ ] 进行条件测试(Bash扩展)
  4. 使用 $() 代替反引号进行命令替换
  5. 设置 set -euo pipefail 使脚本更健壮
  6. 对用户输入进行验证和清理
  7. 使用 printf 代替 echo 处理复杂输出
  8. 为脚本添加注释和用法说明

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