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