在bash heredoc中使用变量
问题的原因是在bash heredoc中使用变量时,如果将定界符放在引号中,就不会进行参数替换。根据bash手册的说明,如果定界符是被引号包围的,那么在here-document中不会执行参数替换、命令替换、算术替换或路径替换。只有在定界符未被引号包围时,here-document中的所有行都会进行参数替换、命令替换和算术替换。
解决方法是将定界符从<< "EOF"
更改为<<EOF
。这样做后,变量将会被正确地替换。
在第二个例子中,shell只会使用sudo
和参数cat
,重定向将应用于sudo cat
的输出,而不是原始用户。如果想让它正常工作,可以尝试以下命令:sudo sh -c "cat > /path/to/outfile" <<EOT
。另外,也可以使用(cat > /path/to/outfile) <<EOF
替代sudo sh -c ... <<EOF
。
以上是关于在bash heredoc中使用变量的问题的原因和解决方法。请告诉我是否有其他关于这个问题的好的解释。
使用变量以内插的方式放置在bash heredoc中的原因是,有时候我们只希望部分变量被内插。可以通过使用反斜杠来转义美元符号和反引号,或者将静态文本放置在一个变量中来解决这个问题。
在上述代码示例中,我们可以看到使用了反斜杠来转义美元符号和反引号。另外,我们还可以将静态文本放置在变量中。这样,我们就能够灵活地控制哪些变量需要被内插,哪些不需要。
在第一个示例中,我们定义了两个变量:Name和dough。然后,我们使用heredoc来输出一段文本,其中包含了这两个变量的值。需要注意的是,如果我们想要输出反引号本身而不是其执行结果,需要对其进行转义。
在第二个示例中,我们演示了如何在本地变量和远程主机之间进行组合。我们首先获取了本地主机的名称,并将其赋值给local变量。然后,我们通过ssh命令连接到远程主机,并在heredoc中执行一段脚本。这段脚本中,我们首先输出了本地主机的名称,然后通过在变量前加上反斜杠来阻止本地展开变量。最后,我们输出了远程主机的名称。
需要注意的是,任何引用机制(如\____HERE或"____HERE"或'____HERE')都会禁用所有变量内插,并将heredoc转换为纯文本。
总结起来,使用变量内插的方式放置在bash heredoc中可以灵活地控制哪些变量需要被内插,哪些不需要。通过使用反斜杠来转义特殊字符,或者将静态文本放置在变量中,我们可以解决这个问题。这在组合本地变量和远程脚本、跨不同shell、编程语言或远程主机执行脚本时非常有用。