- 1 脚本优化
- 1.1 使用内置命令
- 1.2 减少子 shell 使用
- 1.3 使用数组处理大量数据#
- 1.4 Enable Noclobber#
- 1.5 使用函数#
- 1.6 高效的文件操作#
- 1.7 并行处理#
- 2 错误处理#
- 2.1 当发生错误时立即退出#
- 2.2 自定义错误消息#
- 2.3 捕获信号#
- 2.4 验证输入#
- 2.5 记录日志#
本文为摘录,原文为: https://omid.dev/2024/06/19/advanced-shell-scripting-techniques-automating-complex-tasks-with-bash/
1 脚本优化
优化对于确保脚本高效运行至关重要,特别是在处理大型数据集或密集任务时。以下是一些优化 Bash 脚本的关键技巧。
1.1 使用内置命令
尽可能利用内置的 Shell 命令,而不是外部可执行文件。内置命令执行更快,因为它们不需要加载外部进程。例如,在条件语
句中使用 [[ ]]
而不是 [ ]
或 test
。
# 低效的写法
if [ "$var" -eq 1 ]; then
echo "等于 1"
fi
# 高效的写法
if [[ "$var" -eq 1 ]]; then
echo "等于 1"
fi
1.2 减少子 shell 使用
子 shell 在性能方面可能很昂贵。尽量避免它们,可以使用内置命令或参数扩展。
# 低效的写法
output=$(cat file.txt)
# 高效的写法
output=$(<file.txt)
1.3 使用数组处理大量数据#
处理大量数据时,数组可能比多个变量更高效且更易管理。
# 低效的写法
item1="苹果"
item2="香蕉"
item3="樱桃"
# 高效的写法
items=("苹果" "香蕉" "樱桃")
for item in "${items[@]}"; do
echo "$item"
done
1.4 Enable Noclobber#
为防止意外覆写文件,请使用 noclobber
选项。这在生成临时文件的脚本中尤为有用。
set -o noclobber
noclobber
选项可用于避免使用重定向输出时覆盖现有文件(/请参阅内置命令::)。’>|‘重定向操作符可用于覆 盖noclobber
。
1.5 使用函数#
函数允许您封装和重用代码,使脚本更加清晰,减少冗余。
function greet() {
local name=$1
echo "Hello, $name"
}
greet "Alice"
greet "Bob"
1.6 高效的文件操作#
在进行文件操作时,请使用高效的技术以最小化资源使用。
# 低效的方式
while read -r line; do
echo "$line"
done < file.txt
# 高效的方式
while IFS= read -r line; do
echo "$line"
done < file.txt
1.7 并行处理#
对于可以并行执行的任务,考虑使用并行处理来加速脚本。像 xargs 和 GNU parallel 这样的工具非常有用。
# 使用 xargs 进行并行处理
cat urls.txt | xargs -n 1 -P 4 curl -O
2 错误处理#
健壮的错误处理对于创建可靠且易维护的脚本至关重要。以下是一些增强 Bash 脚本错误处理的技巧。
2.1 当发生错误时立即退出#
使用 set -e 确保如果任何命令失败,脚本会立即退出,防止出现级联错误。
set -e
2.2 自定义错误消息#
实现自定义错误消息以在出现问题时提供更多上下文信息。
command1 || { echo "command1 failed"; exit 1; }
2.3 捕获信号#
使用 trap 命令来捕获和优雅地处理信号和错误。
trap 'echo "Error occurred"; cleanup; exit 1' ERR
function cleanup() {
# 清理代码
}
2.4 验证输入#
始终验证用户的输入和脚本参数,以防止意外行为。
if [[ -z "$1" ]]; then
echo "用法: $0 <参数>"
exit 1
fi
2.5 记录日志#
实现日志记录以跟踪脚本执行并诊断问题。
logfile="script.log"
exec > >(tee -i $logfile)
exec 2>&1
echo "脚本已启动"