终端作为交互式工具,用户可以通过它与shell环境进行交互。在终端中打印文本是绝大多数shell脚本和工具日常需要进行的基本任务。能够执行打印的方法有很多,格式也各有不同。

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的值,或者什么都不返回。

另一个可用于终端打印的命令是printfprintf使用的参数和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

2. 补充

一定要留神的是echoprintf中的标志(如-e-n等)应该出现在命令行内任何字符串之前,否则Bash会将其视为另外一个字符串。

  1. echo中转义换行符

    在默认情况下,echo会将一个换行符追加到输出文本的尾部。可以使用标志-n来忽略结尾的换行符。echo同样接受双引号字符串内的转义序列(escape sequence)作为参数。如果需要使用转义序列,则采用echo -e"包含转义序列的字符串"这种形式。例如:

    echo -e "1\t2\t3"
    1 2 3
    
  2. 打印彩色输出

    在终端中生成彩色输出相当好玩,我们可以使用转义序列来实现。

    每种颜色都有对应的颜色码。比如:重置=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"