如何在FreeBSD的Bash中提取脚本引用的变量列表?
提取Bash风格引用变量的可行方案
实现思路
通过正则匹配$X或${X}格式的变量引用,提取其中的变量名,再配合排序去重工具完成最终需求。以下是两种适配FreeBSD Bash环境的实现方式:
方式1:用FreeBSD原生grep + sed
直接使用系统自带的grep(启用扩展正则)匹配变量引用,再通过sed剥离前缀,提取纯变量名:
# 提取所有引用的变量名 grep -oE '\$([A-Za-z0-9_]+|\{[A-Za-z0-9_]+\})' 目标脚本文件 | sed -E 's/\$([A-Za-z0-9_]+)|\$\{([A-Za-z0-9_]+)\}/\1\2/g' # 配合去重排序 grep -oE '\$([A-Za-z0-9_]+|\{[A-Za-z0-9_]+\})' 目标脚本文件 | sed -E 's/\$([A-Za-z0-9_]+)|\$\{([A-Za-z0-9_]+)\}/\1\2/g' | sort | uniq
方式2:用pcregrep(更简洁)
若已通过pkg install pcre安装pcregrep,可利用正向预查直接提取变量名,无需后续处理:
# 提取所有引用的变量名 pcregrep -o '(?<=\$)([A-Za-z0-9_]+)(?=\b)|(?<=\$\{)([A-Za-z0-9_]+)(?=\})' 目标脚本文件 # 配合去重排序 pcregrep -o '(?<=\$)([A-Za-z0-9_]+)(?=\b)|(?<=\$\{)([A-Za-z0-9_]+)(?=\})' 目标脚本文件 | sort | uniq
正则说明
- 针对
$X格式:\$([A-Za-z0-9_]+)匹配并捕获变量名,(?<=\$)([A-Za-z0-9_]+)(?=\b)通过正向预查直接定位变量名 - 针对
${X}格式:\$\{([A-Za-z0-9_]+)\}匹配并捕获变量名,(?<=\$\{)([A-Za-z0-9_]+)(?=\})直接提取花括号内的变量名
特殊情况处理
如果脚本中存在转义的\$(非变量引用),可添加反向预查排除这类场景:
grep -oE '(?<!\\)\$([A-Za-z0-9_]+|\{[A-Za-z0-9_]+\})' 目标脚本文件 | sed -E 's/(?<!\\)\$([A-Za-z0-9_]+)|(?<!\\)\$\{([A-Za-z0-9_]+)\}/\1\2/g' | sort | uniq
内容的提问来源于stack exchange,提问作者Bob Vesterman
相关产品推荐
相关产品推荐

