shell中如何表示换行?

shell中如何表示换行?

我是我的 debian7.8 bash shell。

str="deb http://ftp.cn.debian.org/debian/ wheezy main contrib non-free  \n  
      deb-src http://ftp.cn.debian.org/debian/ wheezy main contrib non-free  "

echo $str > test  

在我的测试文件中它是:

deb http://ftp.cn.debian.org/debian/ wheezy main contrib non-free \n deb-src http://ftp.cn.debian.org/debian/ wheezy main contrib non-free

我想要的是:

deb http://ftp.cn.debian.org/debian/ wheezy main contrib non-free 
deb-src http://ftp.cn.debian.org/debian/ wheezy main contrib non-free

如何正确表达换行?

答案1

除了 jasonwryan 的建议之外,我建议使用printf

$ printf "%s http://ftp.cn.debian.org/debian/ wheezy main contrib non-free\n" deb deb-src > test
$ cat test
deb http://ftp.cn.debian.org/debian/ wheezy main contrib non-free
deb-src http://ftp.cn.debian.org/debian/ wheezy main contrib non-free

由于printf重复使用格式字符串直到参数用完,因此它提供了一种打印重复行的好方法。

答案2

只需在引号内包含一个实际的换行符(这适用于单引号或双引号)。请注意,如果第二行缩进,则空格是字符串的一部分。此外始终在变量替换周围使用双引号

str="deb http://ftp.cn.debian.org/debian/ wheezy main contrib non-free
deb-src http://ftp.cn.debian.org/debian/ wheezy main contrib non-free"
echo "$str" > test

Ksh、bash 和 zsh(但不是普通的 sh)有另一种引用语法,$'…'其中反斜杠开始类似 C 的转义序列,因此您可以编写\n来表示换行符。在你的情况下,它的可读性会较差:

str=$'deb http://ftp.cn.debian.org/debian/ wheezy main contrib non-free\ndeb-src http://ftp.cn.debian.org/debian/ wheezy main contrib non-free'
echo "$str" > test

A这里的文档通常是一种更易读的方式来呈现多行字符串。请注意,此处文档作为命令的标准输入传递,而不是作为命令行参数。

cat <<EOF >test
deb http://ftp.cn.debian.org/debian/ wheezy main contrib non-free
deb-src http://ftp.cn.debian.org/debian/ wheezy main contrib non-free
EOF

1或者更一般地说,如果您指定了备用文件描述符,则作为输入。

答案3

一种选择是使用echo -e扩展转义序列。第二种选择是简单地使用“文字”换行符(适用于bash):

str = "deb ... non-free  "$'\n'"deb-src ... non-free  "
echo "$str"

请注意$'···'插入文字的符号。

然而,在这样的变量中添加换行符并不是一个好主意。阅读脚本比较困难,如果"$str"将其提供给不理解转义序列(如果\n使用)或使用分词($''大小写)的其他程序,则可能会导致愚蠢的错误和不需要的行为。只需使用一个数组并对其进行迭代,如果您有更多行,它会使其更具可扩展性。

如果您只想将其放在代码中的一个位置,我会将其分成两个 echo 命令,这至少不会出错。

如果您只想将其放入文件中,另一个有趣且可能是最好的解决方案是此处文档:

cat > test <<EOF
deb http://ftp.cn.debian.org/debian/ wheezy main contrib non-free
deb-src http://ftp.cn.debian.org/debian/ wheezy main contrib non-free
EOF

进一步阅读: https://stackoverflow.com/questions/9139401/trying-to-embed-newline-in-a-variable-in-bash

相关内容