1.2 终端打印
终端作为交互式工具,用户可以通过它与shell环境进行交互。在终端中打印文本是绝大多数shell脚本和工具日常需要进行的基本任务。能够执行打印的方法有很多,格式也各有不同。
1.2.1 实战演练
echo
是用于终端打印的基本命令。
在默认情况下,echo
在每次调用后会添加一个换行符。
- $ echo "Welcome to Bash"
- Welcome to Bash
只需要使用带双引号的文本,结合echo
命令就可以将该文本在终端中打印出来。类似地,不带双引号的文本也可以得到同样的输出结果:
- $ echo Welcome to Bash
- Welcome to Bash
使用单引号也可以完成同样的任务:
- $ echo 'text in quote'
这些方法看起来相似,但各有一些特殊用途和副作用。思考下面这行命令:
- $ echo "cannot include exclamation - ! within double quotes"
这条命令将会返回:
bash: !: event not found error
因此,如果你希望打印!
,那就不要将其放入双引号中,或者你可以在其之前加上一个特殊的转义字符(\)将!
转义。
- $ echo Hello world !
或者
- $ echo 'Hello world !'
或者
- $ echo "Hello world \!" #Escape character \ prefixed.
当在echo
中使用带双引号的文本时,你应该在echo
之前使用set +H
,以便能够正常地显示!
。
每种方法的副作用如下:
- 使用不带引号的
echo
时,你没法在所要显示的文本中使用分号(;
),因为分号(;
)在bash shell中被用作命令定界符。
以echo hello;hello
为例,echo hello
被视为一个命令,第二个hello
则被视为另一个命令。
- 使用带单引号的
echo
时,Bash不会对单引号中的变量(如$var
)求值,而只是照原样显示。
这就意味着:$ echo '$var'
将会返回$var
,而$ echo $var
将会根据变量$var
定义与否,返回$var
的值,或者什么都不返回。
另一个可用于终端打印的命令是printf
。printf
使用的参数和C语言中的printf
函数一样。例如:
- $printf "Hello world"
printf
使用引用文本或由空格分隔的参数。我们可以在printf
中使用格式化字符串。我们还可以指定字符串的宽度、左右对齐方式等。在默认情况下,printf
并不像echo
命令一样会自动添加换行符,我们必须在需要的时候手动添加,比如在下面的脚本中:
#!/bin/bash
#文件名: printf.sh
printf "%-5s %-10s %-4s\n" No Name Mark
printf "%-5s %-10s %-4.2f\n" 1 Sarath 80.3456
printf "%-5s %-10s %-4.2f\n" 2 James 90.9989
printf "%-5s %-10s %-4.2f\n" 3 Jeff 77.564
我们会得到如下格式化的输出:
- No Name Mark
- 1 Sarath 80.35
- 2 James 91.00
- 3 Jeff 77.56
%s
、%c
、%d
和%f
都是格式替代符(format substitution character),其所对应的参数可以置于带引号的格式字符串之后。
%-5s
指明了一个格式为左对齐且宽度为5的字符串替代(-
表示左对齐)。如果不用-
指定对齐方式,字符串则采用右对齐形式。宽度指定了保留给某个变量的字符数。对Name
而言,保留宽度是10。因此,任何Name
字段的内容都会被显示在10字符宽的保留区域内,如果内容不足10字符,余下的则以空格符填充。
对于浮点数,我们可以使用其他参数对小数部分进行舍入。
对于Mark
字段,我们将其格式化为%-4.2f
,其中.2
指定保留2个小数位。注意,在每行格式字符串后都有一个换行符\n
。
1.2.2 补充内容
一定要留神的是echo
和printf
中的标志(如-e
、-n
等)应该出现在命令行内任何字符串之前,否则Bash会将其视为另外一个字符串。
- 在
echo
中转义换行符
在默认情况下,echo
会将一个换行符追加到输出文本的尾部。可以使用标志-n
来忽略结尾的换行符。echo
同样接受双引号字符串内的转义序列(escape sequence)作为参数。如果需要使用转义序列,则采用echo -e"
包含转义序列的字符串"
这种形式。例如:
- echo -e "1\t2\t3"
- 1 2 3
- 打印彩色输出
在终端中生成彩色输出相当好玩,我们可以使用转义序列来实现。
每种颜色都有对应的颜色码。比如:重置=0,黑色=30,红色=31,绿色=32,黄色=33,蓝色=34,洋红=35,青色=36,白色=37。
要打印彩色文本,可输入如下命令:
- echo -e "\e[1;31m This is red text \e[0m"
\e[1;31
将颜色设为红色,\e[0m
将颜色重新置回。你只需要将31
替换成想要的颜色码就可以了。
要设置彩色背景,经常使用的颜色码是:重置=0,黑色=40,红色=41,绿色=42,黄色=43,蓝色=44,洋红=45,青色=46,白色=47。
要打印彩色文本,可输入如下命令:
- echo -e "\e[1;42m Green Background \e[0m"