首页 Shell 打印输出
文章
取消

Shell 打印输出

echo

echo 可能是我们接触 Linux 的第一个命令了。大家都比较熟悉,下面是几个简单的用法:

  • echo "www.zfl9.com www.baidu.com www.google.com",使用双引号扩起来;
  • echo 'www.zfl9.com www.baidu.com www.google.com',使用单引号扩起来;
  • echo www.zfl9.com www.baidu.com www.google.com,也可以省略引号;

上面几个都是最常见的用法,谁都知道,但是下面这些命令,你可能就不一定熟悉了:

  • echo -n "www.zfl9.com"-n选项,不在字符串末尾添加\n换行符;
  • echo -e "\twww.zfl9.com"-e选项,开启字符串转义;
  • echo -e "www.zfl9.com\n\c这些字符串不会被输出"\c表示从这以后的字符串将不再输出;
  • echo -e "\e[32mtrue\e[0m" "\e[35mfalse\e[0m",支持设定字符串颜色,true 为绿色,false 为红色;

转义字符

echo 默认是关闭转义功能的,使用选项-e来显式开启它,下面是一些常见的转义字符:

转义字符说明
\a响铃(BEL),终端会响一声
\b退格(BS),将当前位置退回上一个字符
\r回车(CR),将当前位置移至本行开头
\n换行(LF),将当前位置移至下行开头
\f换页(FF),将当前位置移至下页开头
\t水平制表(HT)
\v垂直制表(VT)
\0空字符(NULL)
\0NNN八进制数字(1 ~ 3 位)
\xHH十六进制数字(1 ~ 2 位)

输出颜色

这个可能是最炫的功能了,我们一起来学习一下,如何让 echo 输出带有颜色的字符!

要想输出颜色,就必须打开转义功能,使用选项-e;格式\e[控制码m字符串,或\033[控制码m字符串

\e[\033[开头,控制码可以有多个,它们之间使用分号;隔开,最后以字符m结束。

为了不影响后续输出,需要使用\e[0m来恢复默认格式,因此,一般形式为:\e[控制码m字符串\e[0m

编码说明
\e[0m恢复默认格式
\e[1m粗体/高亮显示
\e[2m模糊(部分终端支持)
\e[3m斜体(部分终端支持)
\e[4m下划线
\e[5m闪烁(慢)
\e[6m闪烁(快)(部分终端支持)
\e[7m交换背景色与前景色
\e[8m隐藏(什么也看不见)(部分终端支持)
\e[3xm前景色,x 为颜色值(可参见下面的颜色表)
\e[4xm背景色,x 为颜色值(可参见下面的颜色表)
\e[nA光标上移 n 行
\e[nB光标下移 n 行
\e[nC光标右移 n 行
\e[nD光标左移 n 行
\e[y;xH调整光标位置,y 为纵向,x 为横向
\e[s保存光标位置
\e[u恢复光标位置
\e[?25l隐藏光标
\e[?25h显示光标
\e[2J清屏
\ec清屏(推荐)

颜色表

编码说明
0
1
2绿
3
4
5
6
7

注意,这些控制码是由终端支持的,与具体语言无关;
因此你可以使用 C/C++、Java、Python 等语言输出颜色。

printf

除了 echo,还有一个常用的输出命令就是 printf,它支持格式化输出,和 C 语言的 printf() 风格类似。

语法:printf format-string arguments...,和 printf() 一样,它不会自动在字符串末尾添加换行符。

格式参数,以%开头,如果需要输出%本身,需要使用%%进行转义,常用的几个格式:

  • %c,单个字符,如果传入的参数为多个字符,那么只提取第一个字符;
  • %s,字符串,使用%ns控制长度(默认右对齐),使用%-ns进行左对齐,下同;
  • %d,整数(十进制),使用%nd控制长度(默认右对齐),使用%0nd进行高位补零,使用%+d显示正负号;
  • %f,浮点数,精确到小数点后六位(四舍五入),使用%.nf控制精确位数;
  • %e,浮点数,以科学计数法表示,指数部分以小写的 e 表示;
  • %E,浮点数,以科学计数法表示,指数部分以大写的 E 表示;
  • %g,浮点数,自动选择使用%f%e格式;
  • %G,浮点数,自动选择使用%f%E格式;

如果格式参数的个数与实际参数的个数不一致,那么format-string将被重用;

如:printf "%s\n" "baidu" "google" "facebook",将输出三行,说明%s\n被重用了。

printf 支持的转义字符和 echo 一样,并且还额外支持以下几个转义字符:

  • \NNN 八进制数字(0 ~ 3 位)
  • \xHH 十六进制数字(1 ~ 2 位)
  • \uHHHH Unicode码
  • \uHHHHHHHH Unicode码。

echoprintf 都是 bash 的内置命令,因此从效率上讲没多大区别,根据自己的需要选择使用。

本文由作者按照 CC BY 4.0 进行授权

Shell 运算符

Shell 分支与循环