Shell变量替换详解:高效处理字符串与条件赋值

发布于 阅读 67未分类

一、变量基础:$var${var}的区别

  • $var:简单变量引用,适用于变量名无歧义的场景。
  • ${var} :明确界定变量名范围,避免与后续字符混淆。<br />例如:

bash

Bash
A="test"
echo "${A}BBB"  # 输出 testBBB
echo "$A BBB"    # 输出 test BBB(无需花括号)

二、字符串处理:删除匹配模式

1. 操作符 #%

  • # :从左向右删除匹配项。
  • % :从右向左删除匹配项。
  • 单符号:最小匹配(删除最短匹配)。
  • 双符号:最大匹配(删除最长匹配)。

示例:文件路径处理

bash

Bash
file="/dir1/dir2/dir3/my.file.txt"
命令解释结果
${file#*/}删除第一个/及其左侧dir1/dir2/dir3/my.file.txt
${file##*/}删除最后一个/及其左侧my.file.txt
${file#*.}删除第一个.及其左侧file.txt
${file##*.}删除最后一个.及其左侧txt
${file%/*}删除最后一个/及其右侧/dir1/dir2/dir3
${file%%/*}删除第一个/及其右侧(空值)
${file%.*}删除最后一个.及其右侧/dir1/dir2/dir3/my.file
${file%%.*}删除第一个.及其右侧/dir1/dir2/dir3/my

记忆技巧

  • # 像键盘上的“左”键(靠近$左侧),处理左侧字符。
  • % 像键盘上的“右”键(靠近$右侧),处理右侧字符。
  • * 是通配符,表示匹配任意字符。

三、子串截取与替换

1. 截取子串

bash

Bash
${变量:起点:长度}
  • 示例

    bash

    Bash
    ${file:0:5}   # 提取前5个字符:/dir1
    ${file:5:5}   # 从第5字符开始取5个:/dir2

2. 替换内容

bash

Bash
${变量/旧模式/新模式}   # 替换第一个匹配项
${变量//旧模式/新模式}  # 替换所有匹配项
  • 示例

    bash

    Bash
    ${file/dir/path}   # 替换第一个dir为path → /path1/dir2/dir3/...
    ${file//dir/path}  # 全部替换 → /path1/path2/path3/...

3. 获取变量长度

bash

Bash
${#变量}   # 返回字符串的字符数
  • 示例:${#file} → 27。

四、条件赋值:处理变量未定义或空值

1. 语法规则

表达式说明
${var-default}var 未定义,返回 default,否则返回 var
${var:-default}var 未定义或为空,返回 default,否则返回 var
${var+alternate}var 已定义(包括空值),返回 alternate,否则返回空。
${var:+alternate}var 为非空值,返回 alternate,否则返回空。
${var=default}var 未定义,将其赋值为 default 并返回。
${var:=default}var 未定义或为空,将其赋值为 default 并返回。
${var?error_msg}var 未定义,打印 error_msg 并终止脚本。
${var:?error_msg}var 未定义或为空,打印 error_msg 并终止脚本。

2. 示例解析

bash

Bash
# 假设 var 未定义
echo ${var-"未定义"}   # 输出 "未定义"
echo ${var:-"空或未定义"}  # 输出 "空或未定义"

var=""
echo ${var+"已定义"}   # 输出 "已定义"(var存在,即使为空)
echo ${var:+"非空"}    # 无输出(var为空)

var="value"
echo ${var:?"存在"}    # 输出 "value"

五、关键注意事项

  1. 冒号 :的作用<br />带冒号的表达式(如 :-)会同时检查变量是否为空值,不带冒号的仅处理未定义状态。
  2. 赋值与返回值<br />=:= 不仅返回值,还会修改变量的值,适合初始化变量。
  3. 错误处理<br />?:? 用于强制校验变量,避免脚本因缺失关键参数而异常运行。

六、总结

通过灵活使用 ${} 操作符,可以轻松实现字符串裁剪、替换、条件赋值等高阶操作。核心记忆点:

  • #% 控制删除方向。
  • : 决定是否处理空值。
  • 双符号(##%%)启用最大匹配。

掌握这些技巧后,Shell脚本的字符串处理将变得高效且优雅。建议结合实践场景多加练习,以深化理解。

评论 (0)
0 / 500
暂无评论,快来抢沙发~