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 脚本实践所要求的(参见例如什么时候需要双引号?)。