首页 > 代码库 > 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打印输出