Bash脚本虽然强大灵活,但在编写过程中容易犯一些常见错误。以下是Bash编程中常见的陷阱及如何避免它们:
错误示例:
name = "John" # 等号两边有空格
echo $name # 当变量值包含空格时会出问题
正确做法:
name="John" # 等号两边不能有空格
echo "$name" # 总是用引号包裹变量引用
错误示例:
if [ $var == "value" ]; then # 当$var为空时语法错误
正确做法:
if [ "$var" = "value" ]; then # 使用=而不是==,变量加引号
错误示例:
if [ $a > $b ]; then # 这是字符串比较,且>会被解释为重定向
正确做法:
if [ $a -gt $b ]; then # 使用-gt进行整数比较
# 或者
if (( a > b )); then # 使用算术表达式
错误示例:
for file in `ls *.txt`; do # 无法处理文件名中的空格
正确做法:
for file in *.txt; do # 直接使用通配符
# 或者
while IFS= read -r -d '' file; do # 处理复杂文件名
find . -name '*.txt' -print0
done
错误示例:
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 # 正确计数
错误示例:
cd /some/directory
rm *.tmp
正确做法:
cd /some/directory || exit 1
rm *.tmp
错误示例:
echo "当前日期是: `date`" # 反引号在双引号中
正确做法:
echo "当前日期是: $(date)" # 使用$()替代反引号
错误示例:
arr=(one two three)
echo $arr # 只输出第一个元素
正确做法:
arr=(one two three)
echo "${arr[@]}" # 输出所有元素
错误示例:
#!/bin/bash
# 没有设置任何安全选项
rm -rf "$dir/*" # 如果dir未设置会删除根目录
正确做法:
#!/bin/bash
set -euo pipefail # 启用错误退出、未设置变量报错、管道错误检测
rm -rf "${dir:?}/*" # 如果dir未设置或为空会报错
错误示例:
path="$HOME/myfolder"
file="$path/file.txt" # 如果path以/结尾会有两个斜杠
正确做法:
path="$HOME/myfolder"
file="${path%/}/file.txt" # 移除可能的尾部斜杠
#!/bin/bash
或 #!/usr/bin/env bash
作为shebang"$var"
[[ ]]
代替 [ ]
进行条件测试(Bash扩展)$()
代替反引号进行命令替换set -euo pipefail
使脚本更健壮printf
代替 echo
处理复杂输出通过避免这些常见错误,可以编写出更健壮、可靠的Bash脚本。