如何使用带有变量的Bash编写多行字符串?


232

如何在myconfig.conf使用BASH 调用的文件中写入多行?

#!/bin/bash
kernel="2.6.39";
distro="xyz";

echo <<< EOL
line 1, ${kernel}
line 2,
line 3, ${distro}
line 4
line ...
EOL >> /etc/myconfig.conf;
cat /etc/myconfig.conf;

Answers:


471

语法(<<<)和使用的命令(echo)错误。

正确的是:

#!/bin/bash

kernel="2.6.39"
distro="xyz"
cat >/etc/myconfig.conf <<EOL
line 1, ${kernel}
line 2, 
line 3, ${distro}
line 4 line
... 
EOL

cat /etc/myconfig.conf

这种构造称为“ 此处文档”,可以在Bash手册页的下方找到man --pager='less -p "\s*Here Documents"' bash


49
如果要附加,则为cat >>
或Gal

19
这很好用,但是您必须确保终止符前面没有空格EOF,否则它将无法识别,并且会遇到意外的文件结尾错误。
nwinkler 2014年

10
@StevenEckhoff这称为heredoc。
William Pursell 2015年

4
如果我需要sudo权限才能写入文件怎么办?
gfpacheco

14
@gfpacheco您可以使用tee,例如cat << EOL | sudo tee /etc/myconfig.conf
Chen Chen

74
#!/bin/bash
kernel="2.6.39";
distro="xyz";

cat > /etc/myconfig.conf << EOL
line 1, ${kernel}
line 2,
line 3, ${distro}
line 4
line ...
EOL

这就是您想要的。


6
@ktf我输入的速度不快,但字母比您少。^ _ *
肯特,

35

如果您不希望替换变量,则需要在EOL周围加上单引号。

cat >/tmp/myconfig.conf <<'EOL'
line 1, ${kernel}
line 2, 
line 3, ${distro}
line 4 line
... 
EOL

上例:

$ cat /tmp/myconfig.conf 
line 1, ${kernel}
line 2, 
line 3, ${distro}
line 4 line
... 

14

当然,heredoc解决方案是最常用的方法。其他常见的解决方案是:

回声“第1行,'“ $$ {kernel}”'
第2行
第3行,““ $ {distro}””
第4行>> /etc/myconfig.conf

exec 3>&1#保存当前标准输出
exec> /etc/myconfig.conf
回显行1,$ {kernel}
回声线2 
回显第3行,$ {distro}
...
exec 1>&3#恢复标准输出

也许还会指出printf其中引入了更多有趣的变化。
2015年

3

下面的机制有助于将多行重定向到文件。保留完整的字符串,"以便我们可以重定向变量的值。

#!/bin/bash
kernel="2.6.39"
echo "line 1, ${kernel}
line 2," > a.txt
echo 'line 2, ${kernel}
line 2,' > b.txt

的内容a.txt

line 1, 2.6.39
line 2,

的内容b.txt

line 2, ${kernel}
line 2,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.