命令小结

echo命令是 linux 中最基础的命令,也是最常用的命令之一,常用于在终端处进行输入输出验证,而且在写shell脚本的时候,也会被经常用到

实战经验

echo显示字符串与变量

显示字符串,直接打印即可,显示变量,用 $引用, 示例如下:

1
2
3
4
5
6
7
8
9
[baiyongan@bya ~]$ echo 'hello world'
hello world
[baiyongan@bya ~]$ echo "hello world"
hello world
[baiyongan@bya ~]$ echo hello world
hello world
[baiyongan@bya ~]$ str="hello world"
[baiyongan@bya ~]$ echo "$str, good night"
hello world, good night

用echo -e 显示反斜杠转义

转义字符,是shell中的一些有特殊功能的字符,比如\n代表换行,\t代表制表符等。它统一由反斜线 “\“ 开头,后面跟上一个或几个字符。

echo中,要使用转义字符,需要使用 -e 参数,并用双引号将转义字符括起来。

其中: -e enable interpretation of backslash escapes

1
2
3
4
5
6
7
8
[baiyongan@bya ~]$ echo "hello world"
hello world
[baiyongan@bya ~]$ echo "hello world\n"
hello world\n
[baiyongan@bya ~]$ echo -e "hello world\n" #-e参数,实现了换行
hello world

[baiyongan@bya ~]$

常用的转义字符列表

  • \b转义相当于按退格键(backspace),但前提是“\b”后面存在字符;
  • \c不换行输出,在“\c”后面不存在字符的情况下,作用相当于echo -n;
  • \n换行;
  • \t 表示插入tab,即制表符;
  • \f换页,即换行后的新行的开头位置连接着上一行的行尾;
  • \v 垂直制表符,与\f相同;
  • \r光标移至行首,但不换行,相当于使用“\r”以后的字符覆盖“\r”之前同等长度的字符,只看这段文字描述的话可能不容易理解,具体效果查看示例。
  • \表示插入“\”本身;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# \b 的作用:一个"\b"就相当于按一次backspace键
[baiyongan@bya ~]$ echo -e "123\b"
123
[baiyongan@bya ~]$ echo -e "123\b4567"
124567
[baiyongan@bya ~]$ echo -e "123\b\b4567"
14567
[baiyongan@bya ~]$ echo -e "123\b\b\b4567"
4567

# \c 的作用: 如果"\c"后面不存在任何字符时,效果与"echo -n"相同,
#"\c"后面仍然存在字符时,"\c"后面的字符将不会被输出。
[baiyongan@bya ~]$ echo -e "123\c"
123[baiyongan@bya ~]$ echo -n "123"
123[baiyongan@bya ~]$ echo -e "123\c456"
123[baiyongan@bya ~]$

# \f的作用:换行后的新行的开头位置连接着上一行的行尾
[baiyongan@bya ~]$ echo -e "123\f456"
123
456
[baiyongan@bya ~]$ echo -e "hello world\f456"
hello world
456
[baiyongan@bya ~]$ echo -e "hello world\f456\fgoodbye"
hello world
456
goodbye
[baiyongan@bya ~]$

#\v的作用:同 \f
[baiyongan@bya ~]$ echo -e "123\v456"
123
456
[baiyongan@bya ~]$ echo -e "hello world\v456"
hello world
456
[baiyongan@bya ~]$ echo -e "hello world\v456\vgoodbye"
hello world
456
goodbye
[baiyongan@bya ~]$

#\r的作用:表示使用“\r”后面的字符覆盖“\r”之前的同等长度的字符
[baiyongan@bya ~]$ echo -e "abcdefg\r123"
123defg
[baiyongan@bya ~]$ echo -e "abc\r123"
123
[baiyongan@bya ~]$ echo -e "a\r123"
123
[baiyongan@bya ~]$ echo -e "a\r"
a
[baiyongan@bya ~]$

#\\的作用:转义表示\
[baiyongan@bya ~]$ echo -e "abc\\def"
abc\def
[baiyongan@bya ~]$

关闭echo的自动换行行为

默认情况下,echo会在内容输出后换行,如果要改变这种默认方式,可有两种方法:

用 -n 选项去掉echo末尾的换行符;( -n do not output the trailing newline)

用 -e 选项打印出转义字符。

开发shell程序的时候,经常需要用户在一些提示语后的同一行,输入一些内容,这时,就可以用到不换行模式。

1
2
3
4
5
[baiyongan@bya ~]$ echo -n "Enter your username:"
Enter your username:[baiyongan@bya ~]$
[baiyongan@bya ~]$ echo -e "Enter your username:\c"
Enter your username:[baiyongan@bya ~]$
[baiyongan@bya ~]$

echo后面的引号区别:单引号 vs 双引号 vs 无引号

单引号无视所有的特殊字符,所有字符在它眼里都是普通字符;

双引号无视文件通配符,但是对 $,\,`起作用;

不加引号,则会解释所有的特殊字符。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[baiyongan@bya linux_practice]$ echo $USER
baiyongan
[baiyongan@bya linux_practice]$ echo $(date)
Fri May 22 23:48:57 CST 2020
[baiyongan@bya linux_practice]$ echo *
demo.sh
[baiyongan@bya linux_practice]$ ls
demo.sh
[baiyongan@bya linux_practice]$ echo '$USER * $(date)'
$USER * $(date)
[baiyongan@bya linux_practice]$ echo "$USER * $(date)"
baiyongan * Fri May 22 23:49:12 CST 2020
[baiyongan@bya linux_practice]$ echo $USER * $(date)
baiyongan demo.sh Fri May 22 23:49:16 CST 2020
[baiyongan@bya linux_practice]$

使用echo打印双引号 or 单引号

1
2
3
4
5
6
7
8
9
10
11
#打印双引号
[baiyongan@bya linux_practice]$ echo "\"hello wolrd\""
"hello wolrd"
[baiyongan@bya linux_practice]$ echo '"hello world"'
"hello world"
[baiyongan@bya linux_practice]$

#打印单引号
[baiyongan@bya linux_practice]$ echo "'hello again'"
'hello again'
[baiyongan@bya linux_practice]$

echo 在shell中显示色彩

echo通过转义序列,来为输出添加色彩,语法格式如下:

echo -e “\033[颜色1;颜色2m 要展示的文字 \033[0m”

echo

色彩 前景色 背景色
30 40
31 41
绿 32 42
33 43
34 44
洋红 35 45
36 46
37 47

在脚本中显示色彩

有两种方法:

  • 在shell脚本中,事先定义好”颜色变量”,然后使用echo -e 调用变量显示颜色;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/bash
#定义颜色变量,\033 \e \E 都是等价的。
RED='\E[1;31m'
GREEN='\E[1;32m'
YELLOW='\E[1;33m'
BLUE='\E[1;34m'
PINK='\E[1;35m'
RESET='\E[0m'

真正使用时,通过echo -e 调用
echo -e "${RED}Red color${RESET}"
echo -e "${GREEN}Red color${RESET}"
echo -e "${YELLOW}Red color${RESET}"
echo -e "${BLUE}Red color${RESET}"
echo -e "${PINK}Red color${RESET}"

  • 在shell中,事先定义好”颜色动作”,然后直接调用动作来输出变量。(这样可以不用频繁输入echo了。)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
#定义颜色动作,把echo -e 也定义到变量中
SETCOLOR_SUCCESS="echo -en \\E[1;32m"
SETCOLOR_FAILURE="echo -en \\E[1;31m"
SETCOLOR_WARNING="echo -en \\E[1;33m"
SETCOLOR_NORMAL="echo -en \\E[1;39m"

#使用时,直接调用颜色动作即可
$SETCOLOR_SUCCESS && echo SUCCESS
$SETCOLOR_FAILURE && echo FAILURE
$SETCOLOR_WARNING && echo WARNING
$SETCOLOR_NORMAL && echo NORMAL

#测试完之后,可以在终端输入 reset 恢复

使用tput简单的涂色

UNIX 诞生之初,计算机专家就是用终端来登陆到UNIX主机的,而不同类型的终端,用着不同的命令集,这会导致终端与UNIX之间无法配合。为了解决这个问题,计算机专家将几乎所有类型的终端的命令集,都存储到了一个数据库中,以便实现统一化、标准化的处理和响应。这个数据库就叫terminfo

而tput命令,会利用terminfo中的信息,控制和更改终端,比如控制光标、更改文本属性、控制屏幕,以及文本涂色等等。

tput setab:用于设置背景色;(background)

tput setaf:用于设置前景色。(foreground)

数 值 颜 色
0
1
2 绿
3
4
5 洋红
6
7
1
2
3
4
5
6
7
RED=$(tput setaf 1)
GREEN=$(tput setaf 2)
YELLOW=$(tput setaf 3)
RESET=$(tput sgr0)

echo "${RED}red text ${GREEN}green text ${YELLOW}yellow text${RESET}"
# sgr0 表示颜色重置

拓展阅读