bash脚本用cat读取文件内容到变量时变量未解析如何解决
Shell脚本读取文件内容时变量未被替换的解决方案
问题根因
Shell 的变量扩展仅会在解析脚本自身代码、命令行参数的阶段触发,cat命令仅会读取文件的原始文本内容,不会主动对内容内的变量做替换,因此你得到的输出就是文件内的原始字符串I am $name。
可行方案
- 方案1:使用
envsubst工具(最安全,优先推荐)envsubst是专门用于替换文本中环境变量的工具,你已经通过export将name声明为环境变量,只需修改读取文件内容的逻辑即可:
#!/bin/bash export name='toto' file='file.txt' # 直接用envsubst读取文件并替换环境变量 content=$(envsubst < "$file") echo "$content"
该方案不会执行文件中的任意代码,无命令注入风险,兼容性也较好。如果仅需要替换指定变量,也可以指定变量名:envsubst '$name' < "$file",避免其他无关变量被替换。
- 方案2:使用
sed手动替换指定变量
如果仅需要替换少量固定变量,不想依赖额外工具,可以用sed做字符串替换:
content=$(sed "s/\$name/$name/g" "$file")
该方案只会替换你指定的$name变量,安全性高,适配所有自带sed的Unix-like环境。
- 方案3:使用
eval(不推荐,仅适用于文件内容完全可信的场景)
你也可以通过eval强制让Shell解析文本中的变量,但如果文件中包含恶意命令,会被直接执行,有极高的安全风险:
content=$(eval echo \"$(cat "$file")\")
内容的提问来源于stack exchange,提问作者C.Mamba
相关产品推荐
相关产品推荐

