shell脚本--echo和printf打印输出
bash&shell系列⽂章:
注:本⽂关于引号等特殊符号的处理仅仅只是⼏个例⼦,想要彻底搞明⽩shell对特殊符号的解析,见另⼀篇⽂章。
1.2.1 echo引号和感叹号问题
关于echo的⽤法,注意点就是单引号和双引号的特殊情况。
另外,在bash环境下,感叹号只能通过单引号包围来输出,因为此时感叹号表⽰引⽤历史命令,除⾮设置"set +H"关闭历史命令的引⽤。⽽在shell脚本中不会出现这类问题。
以打印“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!
从上⾯⼏个实验发现,在bash环境下,要输出感叹号必须使⽤单引号。这是因为默认情况下开启了使⽤感叹号引⽤内存中的历史命令的设置,可以使⽤set +H 关闭该设置,这时可以使⽤感叹号输出。
[root@xuexi tmp]# set +H
[root@xuexi tmp]# echo"Hello World!"
Hello World!
或者使⽤多对引号分别包围echo的参数,其中感叹号使⽤单引号包围,如下。
[root@xuexi ~]# echo"Don't use rm -rf command"'!'
Don't use rm -rf command!
如果echo不加任何引号,很显然不能输出分号“;”,因为分号会被shell解析为命令连接符号。
[root@xuexi tmp]# echo Hello World;
Hello World  # 分号作为断⾏符号被忽略了
但只加单引号⼜不能扩展变量,使⽤双引号⼜不好输出感叹号,所以echo命令克服各种疑难杂症的⽅法是对特殊符号分开引⽤。
[root@xuexi ~]# str=hello
[root@xuexi ~]# echo"$str"'!'"world"
hello! world
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。
字体控制选项:1表⽰⾼亮,4表⽰下划线,5表⽰闪烁等。
printf怎么格式化输出
因为需要使⽤特殊符号,所以需要配合-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"
颜⾊控制和字体控制选项的定义顺序⽆所谓,只要被定义出来,shell都能识别。建议定义了颜⾊后同时定义关闭颜⾊,否则颜⾊会继续影响bash环境的颜⾊。
另外,任意⼀个\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.2.5 printf
使⽤printf可以输出更规则更格式化的结果。它引⽤于C语⾔的printf命令,但是有些许区别。
使⽤printf可以指定字符串的宽度、实现左对齐(使⽤减符号-)、右对齐(默认的)、格式化⼩数输出等。
使⽤printf最需要注意的两点是:
(1)printf默认不在结尾加换⾏符,它不像echo⼀样,所以要⼿动加“\n”换号;
(2)printf只是格式化输出,不会改变任何结果,所以在格式化浮点数的输出时,浮点数结果是不变的,仅仅只是改变了显⽰的结果。
[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.sh
printf "%-s\t %-s\t %s\n" No Name Mark
printf "%-s\t %-s\t %4.2f\n"1 Sarath 80.34
printf "%-s\t %-s\t %4.2f\n"2 James 90.998
printf "%-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表⽰对字符格式化。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。