首页 > 代码库 > SHELL脚本攻略(学习笔记)--1.2 echo和printf打印输出

SHELL脚本攻略(学习笔记)--1.2 echo和printf打印输出

1.2.1 echo的引号问题

关于echo的用法,注意点就是单引号和双引号的特殊情况。以打印“Hello World!”为例。

[root@xuexi tmp]# echo Hello World!

Hello World!

[root@xuexi tmp]# echo Hello World!

Hello World!

[root@xuexi tmp]# echo "Hello World!"   #双引号不能打印感叹号

-bash: !": event not found

[root@xuexi tmp]# echo Hello World!;echo Hello World!  #感叹号后面不能接分号

-bash: !: event not found

[root@xuexi tmp]# echo Hello World!;echo Hello World!  #感叹号可以在最结尾

Hello World!

Hello World!

从上面几个实验发现,感叹号后面不能接除了单引号的任何符号和字符,因为默认情况下开启了使用感叹号引用内存中的历史命令的设置,可以使用set +H关闭该设置,这时可以使用感叹号输出。

[root@xuexi tmp]# set +H[root@xuexi tmp]# echo "Hello World!"

Hello World!

如果echo不加任何引号,很显然不能输出分号“;”,只加单引号又不能扩展变量,使用双引号又不好输出感叹号,所以要考虑好如何使用echo。

[root@xuexi tmp]# echo Hello World;

Hello World  #分号作为断行符号被忽略了

[root@xuexi tmp]# str=World![root@xuexi tmp]# echo Hello${str}

Hello${str}  #变量作为普通字符输出了

1.2.2 echo中的转义

echo -e识别转义和特殊意义的符号,如换行符/n、制表符/t、转义符\等。

[root@xuexi tmp]# echo Hello World!\n;echo "Hello World"!  

Hello World!\n

Hello World!

[root@xuexi tmp]# echo -e Hello World!\n;echo "Hello World"!

Hello World!

            #换行

Hello World!

1.2.3 echo默认的分行处理

不加-n的默认情况下echo会在每行行尾加上换行符号,使用echo -n取消分行输出。

[root@xuexi tmp]# echo Hello World!>abc.sh  #输入完就加了分行符号[root@xuexi tmp]# echo Hello World!>>abc.sh[root@xuexi tmp]# cat abc.sh

Hello World!

Hello World!

[root@xuexi tmp]# echo -n Hello World!>abc.sh   #取消了分行符号[root@xuexi tmp]# echo Hello World!>>abc.sh [root@xuexi tmp]# cat abc.sh

Hello World!Hello World!

1.2.4 echo的颜色输出

echo可以控制字体颜色和背景颜色输出。

常见的字体颜色:重置=0,黑色=30,红色=31,绿色=32,黄色=33,蓝色=34,紫色=35,天蓝色=36,白色=37。

常见的背景颜色:重置=0,黑色=40,红色=41,绿色=42,黄色=43,蓝色=44,紫色=45,天蓝色=46,白色=47。

因为需要使用特殊符号,所以需要配合-e选项来识别特殊符号。

[root@xuexi tmp]# echo -e "\e[1;41m Red Bcakground \e[0m"[root@xuexi tmp]# echo -e "\e[1;31m Red Bcakground \e[0m" 

技术分享

其中任意一个\e可以使用\033替换。如:

[root@xuexi tmp]# echo -e "\033[1;41m Red Bcakground \033[0m"[root@xuexi tmp]# echo -e "\e[1;31m Red Bcakground \033[0m" 

 

技术分享

颜色还有些控制:1表示高亮、4表示下划线、5表示闪烁等。

技术分享

1.2.5 printf

使用printf可以输出更规则更格式化的结果。它引用于C语言的printf命令,但是有些许区别。

使用printf可以指定字符串的宽度、实现左对齐(使用减符号-)、右对齐(默认的)、格式化小数输出等。使用printf最需要注意的一点是printf默认不在结尾加换行符,它不像echo一样,所以要手动加“/n”换号。

[root@xuexi tmp]# cat >abc.sh<<eof  #将下面的内容覆盖到abc.sh脚本中> #!/bin/bash> #文件名:abc.sh> printf "%-5s %-10s %-4s\n" No Name Mark     #三个%分别对应后面的三个参数> printf "%-5s %-10s %-4.2f\n" 1 Sarath 80.34 #减号“-”表示左对齐> printf "%-5s %-10s %-4.2f\n" 2 James 90.998 #5s表示第一个参数占用5个字符> printf "%-5s %-10s %-4.2f\n" 3 Jeff 77.564> eof
[root@xuexi tmp]# sh abc.sh  #执行结果:左对齐,取小数点后两位

No    Name       Mark

1     Sarath     80.34

2     James      91.00

3     Jeff         77.56

[root@xuexi tmp]# sed -i s#-##g abc.sh  #将减号“-”去掉,结果将右对齐[root@xuexi tmp]# sh abc.sh

   No       Name Mark

    1     Sarath 80.34

    2      James 91.00

    3         Jeff 77.56

printf中还可以加入分行符、制表符等符号。

[root@xuexi tmp]# vim abc.sh   #修改abc.sh将其改为如下格式#!/bin/bash#文件名:abc.shprintf "%-s\t %-s\t %s\n" No Name Markprintf "%-s\t %-s\t %4.2f\n" 1 Sarath 80.34printf "%-s\t %-s\t %4.2f\n" 2 James 90.998printf "%-s\t %-s\t %4.2f\n" 3 Jeff 77.564
[root@xuexi tmp]# sh abc.sh  #出现制表符

No       Name    Mark

1        Sarath  80.34

2        James   91.00

3        Jeff      77.56

printf还有一个常见的i格式,表示对整型格式化占用几个整数,前面示例中的s表示对字符格式化。

SHELL脚本攻略(学习笔记)--1.2 echo和printf打印输出