echo和printf打印输出
[root@node2 scprits]# echo Hello World! Hello World! [root@node2 scprits]# echo 'Hello World!' Hello World! [root@node2 scprits]# echo "Hello World!" -bash: !": event not found #双引号不能打印感叹号 [root@node2 scprits]# echo Hello World!;echo 'Hello World!' -bash: !: event not found [root@node2 scprits]# echo 'Hello World!';echo Hello World! Hello World! Hello World! #感叹号可以在最结尾
从上面几个实验发现,在bash环境下,要输出感叹号必须使用单引号。这是因为默认情况下开启了使用感叹号引用内存中的历史命令的设置,可以使用set +H关闭该设置,这时可以使用感叹号输出。
[root@node2 scprits]# set +H [root@node2 scprits]# echo "Hello World!" Hello World!
或者使用多对引号分别包围echo的参数,其中感叹号使用单引号包围,如下。
[root@node2 scprits]# echo "Don't use rm -rf command"'!' Don't use rm -rf command!
如果echo不加任何引号,很显然不能输出分号“;”,因为分号会被shell解析为命令连接符号。
[root@node2 scprits]# echo Hello World; Hello World [root@node2 scprits]# echo "Hello World;" Hello World;
但只加单引号又不能扩展变量,使用双引号又不好输出感叹号,所以echo命令克服各种疑难杂症的方法是对特殊符号分开引用。
[root@node2 scprits]# str=hello [root@node2 scprits]# echo "$str"'!' "world" hello! world
echo中的转义
echo -e识别转义和特殊意义的符号,如换行符、n、制表符\t、转义符\等。
[root@node2 scprits]# echo 'Hello World!\n';echo "Hello World"! Hello World!\n Hello World!
[root@node2 scprits]# echo -e 'Hello World!\n';echo "Hello World"! Hello World! Hello World!
echo默认的分行处理
不加-n的默认情况下echo会在每行行尾加上换行符号,使用echo -n取消分行输出。
[root@node2 scprits]# echo -n 'Hello World!' >abc.sh [root@node2 scprits]# echo 'Hello World!' >>abc.sh [root@node2 scprits]# cat abc.sh Hello World!Hello World!
[root@node2 scprits]# echo 'Hello World!'>abc.sh [root@node2 scprits]# echo 'Hello World!'>>abc.sh [root@node2 scprits]# cat abc.sh Hello World! Hello World!
echo的颜色输出
echo可以控制字体颜色和背景颜色输出。
常见的字体颜色:重置=0,黑色=30,红色=31,绿色=32,黄色=33,蓝色=34,紫色=35,天蓝色=36,白色=37。
常见的背景颜色:重置=0,黑色=40,红色=41,绿色=42,黄色=43,蓝色=44,紫色=45,天蓝色=46,白色=47。
字体控制选项:1表示高亮,4表示下划线,5表示闪烁等。
因为需要使用特殊符号,所以需要配合-e选项来识别特殊符号。
[root@node2 scprits]# echo -e "\e[1;41m Red Bcakground \e[0m" Red Bcakground [root@node2 scprits]# echo -e "\e[1;31m Red Bcakground \e[0m" Red Bcakground
颜色控制和字体控制选项的定义顺序无所谓,只要被定义出来,shell都能识别。建议定义了颜色后同时定义关闭颜色,否则颜色会继续影响bash环境的颜色。
另外,任意一个\e可以使用\033替换。如:
[root@node2 scprits]# echo -e "\033[1;41m Red Bcakground \033[0m" Red Bcakground [root@node2 scprits]# echo -e "\e[1;31m Red Bcakground \033[0m" Red Bcakground
printf
使用printf可以输出更规则更格式化的结果。它引用于C语言的printf命令,但是有些许区别。
使用printf可以指定字符串的宽度、实现左对齐(使用减符号-)、右对齐(默认的)、格式化小数输出等。
使用printf最需要注意的两点是:
(1)printf默认不在结尾加换行符,它不像echo一样,所以要手动加“\n”换号;
(2)printf只是格式化输出,不会改变任何结果,所以在格式化浮点数的输出时,浮点数结果是不变的,仅仅只是改变了显示的结果。
[root@node2 scprits]# cat >abc.sh<<eof > #!/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@node2 scprits]# bash abc.sh No Name Mark 1 Sarath 80.34 2 James 91.00 3 Jeff 77.56
[root@node2 scprits]# sed -i s#'-'##g abc.sh [root@node2 scprits]# cat 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 [root@node2 scprits]# bash abc.sh No Name Mark 1 Sarath 80.34 2 James 91.00 3 Jeff 77.56
[root@node2 scprits]# cat abc.sh #!/bin/bash #文件名:abc.sh printf "%5s\t %10s\t %4s\n" No Name Mark # 三个%分别对应后面的三个参数 printf "%5s\t %10s\t %4.2f\n" 1 Sarath 80.34 # 减号“”表示左对齐 printf "%5s\t %10s\t %4.2f\n" 2 James 90.998 # 5s表示第一个参数占用5个字符 printf "%5s\t %10s\t %4.2f\n" 3 Jeff 77.564 [root@node2 scprits]# bash abc.sh No Name Mark 1 Sarath 80.34 2 James 91.00 3 Jeff 77.56
printf还有一个常见的i格式,表示对整型格式化占用几个整数,前面示例中的s表示对字符格式化。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?