简洁的Bash编程技巧文档
Bash编程简洁技巧
1. 变量操作
# 设置默认值
${var:-default} # 如果var未设置,返回default
${var:=default} # 如果var未设置,设置var为default并返回
# 字符串操作
${var#pattern} # 从开头删除最短匹配
${var##pattern} # 从开头删除最长匹配
${var%pattern} # 从结尾删除最短匹配
${var%%pattern} # 从结尾删除最长匹配
${var/old/new} # 替换第一个匹配
${var//old/new} # 替换所有匹配
2. 条件判断
# 文件测试
[[ -e file ]] # 文件存在
[[ -f file ]] # 是普通文件
[[ -d file ]] # 是目录
[[ -s file ]] # 文件大小>0
[[ -r file ]] # 可读
[[ -w file ]] # 可写
[[ -x file ]] # 可执行
# 字符串比较
[[ $str == pattern ]] # 字符串匹配
[[ $str =~ regex ]] # 正则匹配
[[ -z $str ]] # 空字符串
[[ -n $str ]] # 非空字符串
# 数值比较
(( a == b )) # 等于
(( a != b )) # 不等于
(( a < b )) # 小于
(( a > b )) # 大于
3. 循环控制
# C风格for循环
for ((i=0; i<10; i++)); do
echo $i
done
# 遍历数组
arr=(a b c)
for i in "${arr[@]}"; do
echo $i
done
# 遍历文件行
while read -r line; do
echo "$line"
done < file.txt
# 无限循环
while true; do
# 代码
break # 退出循环
done
4. 数组操作
# 定义数组
arr=(value1 value2 value3)
# 访问元素
echo ${arr[0]} # 第一个元素
echo ${arr[-1]} # 最后一个元素
# 数组操作
${#arr[@]} # 数组长度
${arr[@]:1:2} # 切片,从索引1开始取2个元素
arr+=(value4) # 追加元素
# 关联数组
declare -A dict
dict[key1]="value1"
dict[key2]="value2"
5. 函数技巧
# 定义函数
myfunc() {
local var1=$1 # 局部变量
echo "$var1"
return 0 # 返回值
}
# 调用函数
result=$(myfunc "arg1") # 捕获输出
myfunc "arg1" # 直接调用
6. 输入输出
# 读取输入
read -p "Enter value: " var
# 格式化输出
printf "Name: %s, Age: %d\n" "$name" $age
# 重定向
cmd > file # 覆盖输出
cmd >> file # 追加输出
cmd 2> file # 错误输出
cmd &> file # 所有输出
cmd1 | cmd2 # 管道
7. 调试技巧
#!/bin/bash
set -e # 遇到错误退出
set -u # 使用未定义变量时报错
set -x # 打印执行的命令
set -o pipefail # 管道中任意命令失败则整个失败
# 临时关闭调试
set +x
8. 实用技巧
# 获取脚本目录
SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd)
# 检查命令是否存在
if ! command -v git &>/dev/null; then
echo "git not found"
exit 1
fi
# 进程替换
diff <(cmd1) <(cmd2)
# 并行执行
for i in {1..10}; do
(cmd $i &)
done
wait
9. 安全实践
# 引用变量防止分词
echo "$var"
# 使用数组安全处理文件名
files=(*.txt)
for file in "${files[@]}"; do
# 处理文件
done
# 清理临时文件
trap 'rm -f "$tempfile"' EXIT
10. 性能优化
# 减少子进程
# 不好
for i in $(seq 1 100); do
# ...
done
# 好
for ((i=1; i<=100; i++)); do
# ...
done
# 使用内置命令替代外部命令
# 不好
echo "$var" | grep "pattern"
# 好
[[ $var =~ pattern ]]