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

使用cat <<EOF>传递参数时Bash脚本变量展开异常求助

解决Bash Here-Doc中变量引用被提前展开的问题

你的问题核心是here-doc里的变量被当前shell提前解析了。在<< EOF模式下,Bash会自动展开所有变量、命令替换等内容,而new_text是你要在生成的inside_file.sh里定义的变量,当前main.sh的环境中不存在这个变量,所以展开后就变成了空字符串。

有两种简单的解决方法:

方法一:转义变量符号

把要保留的变量引用里的$转义,让当前shell忽略它,这样生成的文件里就会保留$new_text:

修改main.sh里的echo行:

echo \${new_text}

或者用双引号包裹转义后的变量:

echo "\${new_text}"

修改后的完整main.sh:

#!/bin/bash

year=2020
text="the year is: "

cat - << EOF > inside_file.sh 

#some lines here

new_text='$text$year'

echo \${new_text}

# some lines here
EOF

bash inside_file.sh

方法二:使用单引号包裹EOF(禁用全局变量展开)

把here-doc的结束标记用单引号括起来,这样整个here-doc里的内容都会被当作纯文本,不会展开任何变量。同时需要调整new_text的赋值逻辑,让$text和$year能被当前shell正常展开:

修改后的完整main.sh:

#!/bin/bash

year=2020
text="the year is: "

cat - << 'EOF' > inside_file.sh 

#some lines here

new_text=''"${text}${year}"''

echo ${new_text}

# some lines here
EOF

bash inside_file.sh

这里'"${text}${year}"'的作用是:在单引号的here-doc环境中,先临时结束单引号,用双引号让当前shell展开$text和$year,再恢复单引号,最终生成的inside_file.sh里会得到new_text='the year is: 2020'。

两种方法都能生成你期望的inside_file.sh内容,运行后也能正确输出the year is: 2020。

内容的提问来源于stack exchange,提问作者jei L

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 08:47:26