You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 05:27:03