为什么$id在EOF后就消失了

为什么$id在EOF后就消失了
cat >run_pos2bed3.sh <<EOF
ls 2*/peaks.txt | while read id;
do echo $id done;
EOF

输入后

纳米仅显示

ls 2*/peaks.txt | while read id;
do echo  done;
EOF

$id之后如何添加EOF

答案1

为什么$id之后就消失了EOF

因为,当您说<<and then 时$,您会得到变量已有的值。如果你这样做

id=foo
cat >run_pos2bed3.sh <<EOF
ls 2*/peaks.txt | while read id;
do echo $id done;
EOF

你会发现你得到了do echo foo done

$id之后如何添加EOF

cat >run_pos2bed3.sh << \EOF
ls 2*/peaks.txt | while read id;
do echo $id done;
EOF

区别就在于上线\之前。EOF<<

答案2

除非引用该文档,否则此处文档的内容将进行扩展(变量和命令替换)。在您的情况下,此处文档未加引号,因此$id已扩展。当文档重定向时,该变量很可能被取消设置,因此它的值被扩展为空字符串。这使得变量看起来好像“消失”了。

反而:

cat >run_pos2bed3.sh <<'END_SCRIPT'
ls 2*/peaks.txt |
while read id; do
    echo "$id"
done
END_SCRIPT

或者,对于更安全的脚本(id实际上不需要该变量),

cat >run_pos2bed3.sh <<'END_SCRIPT'
printf '%s\n' 2*/peaks.txt
END_SCRIPT

正是其中的单引号'END_SCRIPT'使此处的文档被引用(也可以写为"END_SCRIPT"\END_SCRIPT)。

$id我还在文档本身中引用了 的扩展,这是良好的 shell 脚本实践所要求的(参见例如什么时候需要双引号?)。

相关内容