使用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
相关产品推荐
相关产品推荐

