插件窝 干货文章 简洁的Bash编程技巧文档

简洁的Bash编程技巧文档

数组 匹配 var file 596    来源:    2025-05-19

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 ]]