如何在shell中表达换行?


1

我是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

如何正确表达换行符?



还是echo -e...
drewbenn

Answers:


1

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

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

一个here文档往往是呈现多字符串更可读的方式。请注意,此处文档作为标准输入传递给命令¹,而不作为命令行参数传递。

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

¹ 或者,如果指定备用文件描述符,则通常作为输入。


3

除了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重用了格式字符串,直到参数用尽为止,它提供了一种打印重复行的好方法。


0

一种选择是用于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

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.