$ echo "Hello world"Hello world$ echo 'Hello world'Hello world$ echo Hello worldHello world
这些方法看起来相似,但各有一些分外用场和副浸染。如下面这行命令:
$ echo Hello world!Hello world!$ echo 'Hello world!'Hello world!$ echo "Hello world!"-bash: !": event not found
这是由于 H - histexpand 模式打开了导致。命令行下,双引号里面用了 ! 的话,Shell 会以为要实行历史展开,从而导致报错。
办理方法:(set +H关闭histexpand)

$ echo $-himBH$ set +H$ echo $-himB$ echo "Hello world!"
在echo中利用带双引号的文本时,该当在echo之前利用set +H,以便能够正常利用。
每种方法的副浸染:
利用不带引号的echo时,没法在所要显示的文本中利用,由于在bash shell中被用作命令定界符。以echo hello;hello为例,echo hello被视为一个命令,第二个hello则被视为另一个命令。利用带单引号的echo时,Bash不会对单引号中的变量(如$var)求值,而只是照原样显示。这意味着:$ echo '$var'将会返回 $var,而$ echo $var将会根据变量$var定义与否,返回其值,或者什么都不返回。
显示转义字符
在默认情形下,echo会将一个换行符追加到输出文本的尾部。可以利用标志-n或转义字符\c来忽略结尾的换行符。
如果须要利用转义序列,则采取echo -e "包含转义序列的字符串"这种形式。例如:
xx:~ xx$ echo -n "Hello world "Hello world xx:~ xx$xx:~ xx$ echo "1\t2\t3"1\t2\t3xx:~ xx$ echo -e "1\t2\t3"1 2 3xx:~ xx$ echo -e "Hello world \c"Hello world xx:~ xx$
printf命令模拟C程序库中的printf(),利用的参数和C措辞中的printf函数一样。例如:
$ printf "Hello world\n"
在默认情形下,printf并不像echo命令一样会自动添加换行符,必须在须要的时候手动添加,如上Hello world后面添加\n,如下面的脚本:
#!/bin/bash#文件名:printf.shprintf "%-5s %-10s %-4s\n" No Name Maskprintf "%-5s %-10s %-4.2f\n" 1 Zhangsan 87.54323printf "%-5s %-10s %-4.2f\n" 2 Lisi 90.04432printf "%-5s %-10s %-4.2f\n" 3 Wangwu 89.527
我们会得到如下格式的输出:
No Name Mask1 Zhangsan 87.542 Lisi 90.043 Wangwu 89.53
%s、%c、%d和%f都是格式替代符(format substitution character),其所对应的参数可以置于带引号的格式字符串之后。
%-5s指明了一个格式为左对齐且宽度为5的字符串替代(-表示左对齐)。如果不用-指定对齐办法,字符串将采取右对齐办法。
对Name而言,保留宽度是10,其内容都会被显示在10字符宽的保留区域内,如不敷10字符,则用空格符添补。
对付Mark字段,我们将其格式化为%-4.2f,个中.2指定保留2位小数位。
三. 补充内容
须要把稳的是:
echo和printf中的标志(如-e -n等)该当涌如今命令行内任何字符串之前,否则Bash会将其视为其余一个字符串。