如何将文件中的变量作为命名参数传递给Bash脚本?
在Bash中将键值对文件转为命名参数传递给脚本
我有一个格式为VARIABLE=value的文本文件,示例内容如下:
PID=123123 WID=569569 TOKEN=456456456
其中VARIABLE仅包含大写字母,value仅包含字母数字字符([a-zA-Z0-9])。我希望将这些变量以命名参数(选项)的形式传递给脚本,例如:
./script.sh --PID 123123 --WID 569569 --TOKEN 456456456
请问在Bash中是否有简便的实现方法?我已参考过两个Stack Overflow问题:
- 涉及位置参数与命名参数的问题
- 涉及从键值对文件设置环境变量的问题
实现方法
方法1:用xargs快速转换
这是最简洁的方式,通过sed处理每行格式后,用xargs传递参数:
xargs -a <(sed 's/=/ /; s/^/--/' vars.txt) ./script.sh
sed的作用:将每行的=替换为空格,并在开头添加--,把KEY=VAL转为--KEY VALxargs -a <(...):读取处理后的内容,作为参数传递给目标脚本
方法2:数组存储参数(更安全通用)
如果需要更稳妥的处理(比如后续可能扩展值的格式),可以用数组存储参数:
params=() while IFS='=' read -r key val; do params+=( "--$key" "$val" ) done < vars.txt ./script.sh "${params[@]}"
IFS='=' read -r key val:按=分割每行,分别读取键和值,-r防止反斜杠被转义- 数组展开
"${params[@]}":确保每个参数被正确识别,即使值包含特殊字符(当前场景用不到,但扩展性强)
方法3:eval拼接(仅适用于安全内容)
如果能100%确认文件内容无恶意字符,也可以用eval快速拼接命令:
eval "./script.sh $(sed 's/=/ /; s/^/--/' vars.txt)"
注意:
eval会执行字符串中的命令,若文件包含特殊字符或恶意代码,会造成安全风险,谨慎使用。
内容的提问来源于stack exchange,提问作者Konrad
相关产品推荐
相关产品推荐

