echo命令是linux中最基础的命令,在写shell脚本的时候,会经常被用到,echo命令功能非常丰富,下面我们结合实际案例进行详细介绍。

echo命令的基本用法,很简单,就是echo命令后面跟上要输出的文本,如下。

除了基本用法,还可以配合一些选项使用

echo -n 表示不换行输出


如果不添加-n选项,文本输出以后,指定换行了,而添加了-n选项以后,文本直接连着命令提示符输出了,并没有换行,这样演示效果不明显,我们可以同时echo两条信息,效果比较明显,示例如下。

当使用echo输出命令替换后的内容时,命令执行结果的格式可能会发生变化,比如,如果我们想要输出ifconfig命令执行后的结果,我们可能会使用如下命令

但是我们发现,这样输出的文本的格式发生了变化,这样可能不是我们想要的,因为当我们直接执行ifconfig命令时,ifconfig返回的结果是多行的,可是当我们使用echo输出的时候,格式发生了变化,如果想要按照命令执行后的原格式输出命令替换后的结果,可以使用如下方法,如下方法在写脚本的时候可能会用到。

我们可以使用-e选项输出转义字符,比如常用的转义字符”\t”, 转义字符”\t”表示制表符,作用相当于我们键盘上的tab键。

我们可以使用echo -e输出转义字符,将转义后的内容输出到屏幕上,示例如下

上图示例中,已经将”\t”转义过的制表符输出到了屏幕上,所以,我们只要能够记住这些转义字符,就可以在echo命令中输出它们,那么,我们将常用的转义字符总结一下,然后给出示例。

常用的转义字符如下:

\b 转义后相当于按退格键(backspace) ,但前提是”\b”后面存在字符,具体效果参考下方示例。

\c 不换行输出,在”\c”后面不存在字符的情况下,作用相当于echo -n,具体效果参考下方示例。

\n 换行,效果看示例。

\f 换行,但是换行后的新行的开头位置连接着上一行的行尾,具体效果查看示例;

\v 与\f相同;

\t 转以后表示插入tab,即制表符,已经在上面举过例子;

\r 光标移至行首,但不换行,相当于使用”\r”以后的字符覆盖”\r”之前同等长度的字符,只看这段文字描述的话可能不容易理解,具体效果查看示例;

\\ 表示插入”\”本身;

使用echo命令输出上述转义字符的示例如下:

使用echo命令输出”\b”转义字符,在”\b”后面存在字符的前提下,”\b”表示删除前一个字符,”\b\b”表示删除前两个字符。

可以看到,上例中,在”\b”后面不存在任何字符时,”\b”并没有转义为”退格键”,当”\b”后面存在字符时,一个”\b”就相当于按一次backspace键。

我们也可以使用\c转义符,表示不换行输出,但是当”\c”后面仍然存在字符时,”\c”后面的字符将不会被输出,如果”\c”后面不存在任何字符时,效果与使用”echo -n”相同,示例如下。

“\n”转义后表示换行,下例中,被输出的字符从”\n”处开始另起一行。

“\f”转义符表示

换行,但是换行后的新行的开头位置连接着上一行的行尾,如下图示例所示,下图中的第三个例子中有两个”\f”。

“\v”转义符与”\f”转义符的作用相同。

“\r”转义符表示使用”\r”后面的字符覆盖”\r”之前的同等长度的字符,比较不容易理解,但是看下图示例,就很容易明白了。

上图中的第一个示例中,”\r”后面的123覆盖了abc,defg没有被覆盖,第二个示例中,因为abc一共有3个字符,123也是有3个字符,所以123覆盖了abc以后,只剩下了123,第三个实例中,123一共有3个字符,a只有一个字符,覆盖以后只剩下123,第四个示例中,”\r”后面并不存在任何字符,所以”\r”前面的字符没有被覆盖。

“\\”经过转义以后,表示”\”,示例如下。

使用echo命令的-e选项,除了能够输出转义字符,还能够在命令行中输出彩色的字符,或者带有彩色背景的字符。

我们对比着示例,再给大家详细的解释,示例效果如下。

可以看到,上例中输出了红色的大写的”传智教育”,这就是我们所说的,使用echo -e 输出彩色字符的效果。

echo -e我们就不解释了,不管是输出转义字符还是输出彩色字符,都需要使用-e选项。

我们来解释一下字符串“\033[31m传智教育\033[0m”是什么意思。

为了方便解释,我们尽量的缩小范围,我们排除”传智教育”字符串,因为这就是我们要输出的内容,没有什么好解释的,排除输出内容后,结构如下

从上图可以看出,如果要想输出红色字符,至少需要两部分,\033[31m 和 \033[0m ,这些代码有一个专业名词,叫做”ANSI控制码”,但是为了方便理解,我们先用通俗的语言解释它们,用不专业的思维去理解它们。

我们可以把\033[31m 理解成”开始输出红色字符”,把 \033[0m理解成”结束输出红色字符”。

当echo -e遇到\033[31m的时候,就认为自己要输出红色字符了,\033[31m就是一个信号,它告诉echo -e,需要开始输出红色字符了, \033[0m也是一种信号,它告诉echo 命令,红色字符已经不能输出了,再输出的字符应该是黑白字符了,不能是彩色的了。

那么,如果我们想要输出绿色字符,该怎么写呢,示例如下

细心的你一定已经发现,输出红色TEST字符与输出绿色TEST字符的唯一区别就是下图标注的位置。

也就是说,我们只要改变对应位置的数字,就能改变输出字符的颜色,所以,我们将能够输出的颜色对应的数字总结如下:

30:黑色

31:红色

32:绿色

33:黄色

34:蓝色

35:紫色

36:浅蓝色

37:灰色

所以,对应上述颜色号码,输出效果如下:

除了能够使用echo命令输出彩色字符,我们还能够为彩色字符添加彩色背景,比如,我们想要输出具有黄色背景的红色字符,可以使用如下方法

那么我们对比一下,输出红色字符的echo命令,与输出黄色背景的红色字符的echo命令,具体有什么不同。

可以看到,唯一不同的地方就是带有黄色背景的命令中,多出了”43;” ,其他部分的命令都一样。

聪明如你一定想到了,”43;”代表黄色背景,那么别的背景颜色一定会有其对应的数字编号,没有错,此处列出背景色编号:

40:黑色

41:红色

42:绿色

43:黄色

44:蓝色

45:紫色

46:浅蓝色

47:灰色

我们可以同时设定字符的颜色与背景的颜色,怎样搭配随你喜欢,大家可以自己多尝试尝试。

我们在之前已经说过, “\033[31m” “\033[m”这些代码都属于 ansi 控制码。

ansi控制码中不仅有控制颜色的控制码,还有一些提供其他功能的控制码,我们来总结一下。

常用ANSI控制码总结如下:

\033[0m 关闭所有属性 ,也就是说此控制码前面的控制码将会失效,此控制码中的0可以省略。

\033[1m 设置高亮度

\033[4m 下划线

\033[5m 闪烁

\033[7m 反显 ,撞色显示,显示为白底黑字,或者显示为黑底白字

\033[8m 消隐 ,字符颜色将会与背景颜色相同

\033[30m — \33[37m 设置字符颜色

\033[40m — \33[47m 设置背景色

\033[K 清除从光标到行尾的内容

上述ANSI控制码中,有的不能在bash命令行中运行,我们可以掩饰几个可用的,常用的ANSI控制码,示例如下图:

上图中,我们利用echo命令,使用-e选项,结合着ANSI控制码,输出了带有下划线的字符以及撞色显示的字符。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐