${var#pattern}
删除前缀,${var%pattern}
删除后缀,或${var:start:length}
截取子串。${filename%.*}`可移除文件扩展名。在Linux环境中,截取变量名(通常指提取变量值的部分内容)是Shell脚本编程中的常见需求,尤其在处理路径、字符串或配置文件时,以下是几种专业、高效且安全的方法,适用于Bash等主流Shell环境:
使用Shell内置参数扩展(推荐)
这是最高效的方式,无需启动外部进程,直接通过Shell原生语法操作变量值。
截取子字符串
${变量名:起始位置:长度}
- 示例:截取变量值的第2到第5个字符
var="HelloWorld" echo ${var:1:4} # 输出 ello
- 起始位置从0开始计数(
1
表示第2个字符) - 长度可选,省略时截取到末尾(如
${var:5}
输出World
)
- 起始位置从0开始计数(
删除匹配的前缀/后缀
- 删除最短匹配的前缀:
${变量名#匹配模式}
file="/home/user/file.txt" echo ${file#*/} # 输出 home/user/file.txt(删除第一个`/`)
- 删除最长匹配的前缀:
${变量名##匹配模式}
echo ${file##*/} # 输出 file.txt(删除最后一个`/`之前的内容)
- 删除最短匹配的后缀:
${变量名%匹配模式}
echo ${file%.*} # 输出 /home/user/file(删除最后一个`.`及后缀)
- 删除最长匹配的后缀:
${变量名%%匹配模式}
echo ${file%%.*} # 输出 /home/user/file(删除第一个`.`及之后的后缀)
替换子字符串
${变量名/旧模式/新模式} # 替换第一个匹配 ${变量名//旧模式/新模式} # 替换全部匹配
path="dir1/dir2/file" echo ${path///_} # 输出 dir1_dir2/file(替换第一个`/`)
使用外部命令(灵活处理复杂文本)
当需要正则表达式或跨Shell兼容时,可借助常用文本处理工具:
cut
命令
按分隔符截取字段:
var="apple,banana,orange" echo "$var" | cut -d ',' -f 2 # 输出 banana(以`,`分隔,取第2字段)
awk
命令
高级字段处理与模式匹配:
path="/usr/local/bin" echo "$path" | awk -F '/' '{print $3}' # 输出 local(以`/`分隔,取第3字段)
sed
命令
正则表达式替换/提取:
url="https://example.com/page" echo "$url" | sed 's|https://||' # 输出 example.com/page(删除协议头)
实际应用场景示例
场景1:提取文件名(不含路径)
full_path="/var/log/syslog" filename=${full_path##*/} # 输出 syslog
场景2:获取文件扩展名
file="document.tar.gz" extension=${file##*.} # 输出 gz(注意:多层扩展需结合其他逻辑)
场景3:批量重命名文件
for f in *.jpg; do mv "$f" "${f%.jpg}_backup.jpg" # 将 image.jpg 改为 image_backup.jpg done
最佳实践与注意事项
- 安全性:
- 对用户输入变量使用
${var-}
语法避免未定义报错(如${var:-default}
设置默认值)。 - 含空格的变量必须用双引号包裹(如
"$var"
),防止字段分割错误。
- 对用户输入变量使用
- 性能优先:
- 内置参数扩展 >
awk
>sed
>cut
,优先选择Shell原生操作。
- 内置参数扩展 >
- 兼容性:
- 参数扩展在Bash/Zsh中支持良好,若需兼容老式Shell(如
sh
),改用外部命令。
- 参数扩展在Bash/Zsh中支持良好,若需兼容老式Shell(如
- 复杂匹配:
- 涉及正则表达式时(如贪婪匹配),
awk
或sed
更灵活。
- 涉及正则表达式时(如贪婪匹配),
权威参考
- GNU Bash手册:
Shell Parameter Expansion(官方参数扩展文档) - IEEE POSIX标准:
Shell Command Language(跨Shell环境规范) - Linux man pages:
终端输入man bash
或man cut
查看工具手册。
提示:生产环境中建议在脚本开头添加
set -u
避免未定义变量误用,并通过#!/bin/bash
指定解释器保证兼容性。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/41985.html