Bash shell用法
目录
- 变量引用
- 多行注释
- 参数
- **1. 位置参数**
- **2. 参数扩展**
- **3. 特殊参数**
- bash常见测试选项
- **注意事项**
- **常用组合示例**
- 大括号扩展用法
- **1. 扩展类用法**
- **(1) 字符串扩展**
- **(2) 数字序列扩展**
- **(3) 变量扩展保护**
- **2. 代码块类用法**
- **(1) 组合命令(当前 Shell 执行)**
- **(2) 匿名代码块(作用域隔离)**
- **3. 特殊扩展技巧**
- **(1) 前缀/后缀批量操作**
- **(2) 嵌套扩展**
- **(3) 与 for 循环结合**
- **4. 注意事项**
- 5. **经典应用场景**
- shell写法优化
- **1. 获取当前路径**
- **2. 字符串拼接**
- **3. 条件判断优化**
- **4. 数组操作**
- **5. 命令结果处理**
- **6. 默认值与错误处理**
- **7. 跳过无匹配项**
- **8. 快速调试**
变量引用
以NAME="John"
为例:
语法 | 输出结果 | 说明 |
---|---|---|
echo $NAME | John | 基本引用:简单但易出错(如值含空格或特殊字符时) |
echo ${NAME} | John | 推荐写法:明确变量边界,避免歧义 |
echo "$NAME" | John | 引号保护:值含空格或特殊字符时保留原格式(如 "John Doe" ) |
echo '$NAME' | $NAME | 单引号:禁止变量扩展,原样输出 |
echo "${NAME}!" | John! | 混合使用:变量后紧跟其他字符时必需(如 "${NAME}_suffix" ) |
实际应用场景
-
安全引用值(始终推荐)
file_path="/path/with spaces" cp "$file_path" /backup # 正确:保留路径中的空格 cp $file_path /backup # 错误:会被拆分为多个参数
-
变量拼接
user="Alice" echo "Hello, ${user}!" # => Hello, Alice! echo "Hello, $user!" # 也可工作,但不如 `${}` 清晰
-
防止歧义
count=1 echo "We have $countapple" # 错误:解析为 `$countapple`(未定义的变量) echo "We have ${count}apple" # 正确:=> We have 1apple
-
单引号用于原样输出
echo '当前用户是 $USER' # => 当前用户是 $USER
多行注释
使用 :<<
语法(最标准方式)
在 << COMMENT 和 COMMENT 之间的内容会被当成注释。单引号包裹的 'COMMENT'
可防止内容中的特殊字符被解析。可自定义终止标记(如 EOF
、BLOCK_COMMENT
等)
:<< 'COMMENT'
这是多行注释内容
可以写任意多行
变量不会被展开:$PATH
特殊字符也不会被解析:* ? []
COMMENT
参数
1. 位置参数
参数 | 描述 |
---|---|
$0 | 脚本名称(如 ./script.sh ) |
$1 - $9 | 第 1 到第 9 个参数 |
${10} + | 第 10 个及以后的参数(必须用花括号) |
$# | 参数的总个数 |
$@ | 所有参数的列表(每个参数作为独立字符串,推荐使用) |
$* | 所有参数的列表(合并为单个字符串,用空格分隔,慎用) |
示例:
#!/bin/bash
echo "脚本名: $0"
echo "第一个参数: $1"
echo "所有参数: $@"
echo "参数总数: $#"
2. 参数扩展
用于对参数进行高级操作:
语法 | 描述 |
---|---|
${var:-default} | 如果 var 未设置或为空,返回 default |
${var:=default} | 如果 var 未设置或为空,将其赋值为 default 并返回 |
${var:?error_msg} | 如果 var 未设置或为空,打印 error_msg 并退出脚本 |
${var:+replacement} | 如果 var 已设置且非空,返回 replacement |
${var:offset:len} | 从 var 的 offset 位置开始截取 len 长度的子字符串 |
${#var} | 返回 var 的字符串长度 |
${var#pattern} | 删除 var 开头匹配 pattern 的最短部分 |
${var##pattern} | 删除 var 开头匹配 pattern 的最长部分 |
${var%pattern} | 删除 var 结尾匹配 pattern 的最短部分 |
${var%%pattern} | 删除 var 结尾匹配 pattern 的最长部分 |
${var/old/new} | 将 var 中第一个 old 替换为 new |
${var//old/new} | 将 var 中所有 old 替换为 new |
示例:
name="John Doe"
echo ${name:-"Guest"} # 如果 name 为空则输出 "Guest"
echo ${name:0:4} # 输出 "John"
echo ${name#J} # 输出 "ohn Doe"
echo ${name//o/X} # 输出 "JXhn DXe"
3. 特殊参数
参数 | 描述 |
---|---|
$? | 上一个命令的退出状态(0 表示成功,非 0 表示失败) |
$$ | 当前 Shell 进程的 PID |
$! | 最后一个后台进程的 PID |
$_ | 上一个命令的最后一个参数 |
示例:
grep "pattern" file.txt
if [ $? -ne 0 ]; thenecho "查找失败"
fi
bash常见测试选项
选项 | 含义 | 示例 | 典型用途 |
---|---|---|---|
字符串测试 | |||
-z | 检查字符串是否为空 | [ -z "$var" ] | 验证必填参数 |