如何提取Shell脚本中使用的环境变量?
提取Shell脚本中的环境变量工具方案
我有一些需依赖多个环境变量才能正常运行的大型Shell脚本。手动逐行读取代码提取所有被调用的环境变量不仅十分繁琐,还极易出现遗漏情况。请问是否存在可完成此类任务的脚本或插件?
示例脚本与预期结果
teste.sh:
if [ ! -z "$CI_COMMIT_TAG" ] ; then export DOCKER_IMAGE_FULL_NAME="$REGISTRY_URL/$DOCKER_IMAGE_NAME:$CI_COMMIT_TAG" else export DOCKER_IMAGE_FULL_NAME="$REGISTRY_URL/$DOCKER_IMAGE_NAME:pid$CI_PIPELINE_ID" fi
预期提取的外部依赖变量:
$CI_COMMIT_TAG $REGISTRY_URL $DOCKER_IMAGE_NAME $CI_PIPELINE_ID
可行解决方案
基础正则提取(快速获取所有变量)
使用grep匹配所有$开头的变量名,自动去重排序:grep -o '\$\w\+' teste.sh | sort -u该命令能快速识别
$VAR格式的变量,会包含脚本内部定义的变量(如示例中的DOCKER_IMAGE_FULL_NAME),适合需要提取所有变量引用的场景。增强版提取(支持带花括号的变量)
若脚本中存在${VAR}格式的变量,用awk处理更全面:awk -F'[$]' '{for(i=2;i<=NF;i++){match($i,/^[a-zA-Z_][a-zA-Z0-9_]*/); if(RSTART) print "$" substr($i,RSTART,RLENGTH)}}' teste.sh | sort -u此命令兼容
$VAR和${VAR}两种格式,同样会包含内部定义的变量。精准提取外部依赖变量
用shellcheck静态分析工具过滤出脚本中未定义的外部环境变量(需先安装shellcheck):shellcheck teste.sh | grep 'SC2154' | awk '{print "$"$NF}' | sort -uSC2154是shellcheck检测"未定义变量"的规则,此方法会自动排除脚本内部定义的变量(如示例中的
DOCKER_IMAGE_FULL_NAME),只提取真正需要外部传入的环境变量,适合精准排查依赖的场景。
内容的提问来源于stack exchange,提问作者Felipe Vegini
相关产品推荐
相关产品推荐

