换行在平常的shell编程中是经常遇到的,但是有时也会忽略掉一些问题。本篇中将会介绍多种方式实现输出换行的方法。

使用 echo

echo 自带换行

echo 命令输出字符串,在最后后会添加一个换行

1
2
3
root@Michael:~# echo hello world
hello world
root@Michael:~#

添加 -n 可以禁用echo最后的换行

1
2
root@Michael:~# echo -n hello world
hello worldroot@Michael:~#

换行符”\n”

但是当我们使用bash执行以下命令时,发现它并没有换行

1
2
3
root@Michael:~#  bash -c "echo \"\n\""
\n
root@Michael:~#

而是需要加一个 -e

1
2
3
4
root@Michael:~# bash -c "echo -e \"\n\""


root@Michael:~#

从echo的说明中可以看到 -e 指的是让转义符生效,其中有:

1
2
3
4
5
6
7
8
9
10
11
12
13
If -e is in effect, the following sequences are recognized:
\\ backslash
\a alert (BEL)
\b backspace
\c produce no further output
\e escape
\f form feed
\n new line
\r carriage return
\t horizontal tab
\v vertical tab
\0NNN byte with octal value NNN (1 to 3 digits)
\xHH byte with hexadecimal value HH (1 to 2 digits)

另外可以在字符串前加 $ 符号

1
2
3
4
root@Michael:~# echo $'hello\nworld'
hello
world
root@Michael:~#

使用echo多行模式

上例子

1
2
3
4
5
6
7
root@Michael:~# echo """hello
world
"""
hello
world

root@Michael:~#

使用”””符号,包裹着多行字符串,实现多行输出。
但是这种方式有个问题,即当字符串中存在变量时,会将变量先进行解析,如

1
2
3
4
5
6
7
echo """hello
$hello
"""
hello


root@Michael:~#

而有的时候我们希望是保留原始字符串$hello。这时可以在变量$前加上转义符$

1
2
3
4
5
6
7
root@Michael:~# echo """hello
\$hello
"""
hello
$hello

root@Michael:~#

也可以使用三个单引号’’’替换三个双引号”””

1
2
3
4
5
6
7
root@Michael:~# echo '''hello
> $hello
> '''
hello
$hello

root@Michael:~#

使用cat命令输出多行

1
2
3
4
5
6
root@Michael:~# cat <<EOF
> hello
> world
> EOF
hello
world

与echo一样,如果字符串中存在变量,该方式同样会解析变量。这时可以在第一个EOF两边添加引号,如

1
2
3
4
5
6
7
root@Michael:~# cat <<'EOF'
$hello
world
EOF
$hello
world
root@Michael:~#

使用printf

使用printf打印字符串中的\n换行符,单引号,双引号均可

1
2
3
4
5
6
7
root@Michael:~# printf "hello\nworld\n"
hello
world
root@Michael:~# printf 'hello\nworld\n'
hello
world
root@Michael:~#

对于变量问题,与echo一样,可以为$添加转义符\$, 或者使用单引号。
如:

1
2
3
4
root@Michael:~# printf 'hello \n$hello\n'
hello
$hello
root@Michael:~#