LV02-02-shell-03-运算符和语句

本文主要是shell——运算符和语句相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。

点击查看使用工具及版本
Windows windows11
Ubuntu Ubuntu16.04的64位版本
VMware® Workstation 16 Pro 16.2.3 build-19376536
SecureCRT Version 8.7.2 (x64 build 2214) - 正式版-2020年5月14日
开发板 正点原子 i.MX6ULL Linux阿尔法开发板
uboot NXP官方提供的uboot,NXP提供的版本为uboot-imx-rel_imx_4.1.15_2.1.0_ga(使用的uboot版本为U-Boot 2016.03)
linux内核 linux-4.15(NXP官方提供)
STM32开发板 正点原子战舰V3(STM32F103ZET6)
点击查看本文参考资料
参考方向 参考原文
------
点击查看相关文件下载
--- ---

一、运算符

shell 支持很多运算符,包括算数运算符关系运算符布尔运算符字符串运算符文件测试运算符。原生 bash 不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr , expr 最常用,它是一款表达式计算工具,使用它能完成表达式的求值操作。

1.算术运算符

运算符 说明 实例(设变量a=6, b=3)
+ 加法 expr $a + $b 结果为 9
- 减法 expr $a - $b 结果为 3
* 乘法,注意要加 \ expr $a \* $b 结果为 18
/ 除法 expr $a / $b 结果为 2
% 取余 expr $b % $a 结果为 0
= 赋值 a=$b 把变量 b 的值赋给 a
== 相等,比较两个数字,相同则返回 true [ $a == $b ] 返回 false
!= 不相等,比较两个数字,不相同则返回 true [ $a != $b ] 返回 true

【注意】

(1)表达式和运算符之间要有空格,例如 $a+$b 是不对的,必须写成 $a + $b 。

(2)使用 expr 时,完整的表达式要被 ` 包含。

(3)赋值操作时, = 两端不能有空格。

(4)条件表达式要放在方括号之间,并且与方括号之间要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ] 。

(5)乘号( * )前边必须加反斜杠( \ )才能实现乘法运算。

2.关系运算符

关系运算符只支持数字,不支持字符串,除非字符串的值是数字。

运算符 说明 实例(设变量a=6, b=3)
-eq 相等 == [ $a -eq $b ] 返回 false
-ne 不相等 != [ $a -ne $b ] 返回 true
-gt 大于 > [ $a -gt $b ] 返回 true
-lt 小于 < [ $a -lt $b ] 返回 false
-ge 大于等于 >= [ $a -ge $b ] 返回 true
-le 小于等于 <= [ $a -le $b ] 返回 false

3.布尔运算符

运算符 说明 实例(设变量a=6, b=3)
! ! [ ! false ] 返回 true
-o | [ $a -lt 7 -o $b -gt 10 ] 返回 true
-a & [ $a -lt 7 -o $b -gt 10 ] 返回 false

4.逻辑运算符

运算符 说明 实例(设变量a=6, b=3)
&& 逻辑的 and [[ $a -lt 10 && $b -gt 10 ]] 返回 false
|| 逻辑的 or [[ $a -lt 10 || $b -gt 10 ]] 返回 true

5.字符串运算符

运算符 说明 实例(设变量a="abc", b="abd")
= 检测两个字符串是否相等,相等返回 true [ $a = $b ] 返回 false
!= 两个字符串是否不相等,不相等返回 true [ $a != $b ] 返回 true
-z 字符串长度是否为0,为0返回 true [ -z $a ] 返回 false
-n 字符串长度是否不为 0,不为 0 返回 true [ -n $a ] 返回 true
$ 字符串是否为空,不为空返回 true [ $a ] 返回 true

6.文件测试运算符

文件测试运算符用于检测 Unix 文件的各种属性

运算符 说明
-b file 检测文件是否是块设备文件,如果是,则返回 true。
-c file 检测文件是否是字符设备文件,如果是,则返回 true。
-d file 检测文件是否是目录,如果是,则返回 true。
-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。
-g file 检测文件是否设置了 SGID 位,如果是,则返回 true。
-k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。
-p file 检测文件是否是有名管道,如果是,则返回 true。
-u file 检测文件是否设置了 SUID 位,如果是,则返回 true。
-r file 检测文件是否可读,如果是,则返回 true。
-w file 检测文件是否可写,如果是,则返回 true。
-x file 检测文件是否可执行,如果是,则返回 true。
-s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。
-e file 检测文件(包括目录)是否存在,如果是,则返回 true。
-L file 检测测文件是否为符号链接,如果是,则返回 true。
file1 -nt file2 测试文件 file1 是否比文件 file2 更新。
file1 -ot file2 测试文件 file1 是否比文件 file2 更旧。

二、说明性语句

其实就是注释,以 # 号开始到该行结束,不被解释执行。 sh 里没有多行注释,只能每一行加一个#号。

1
2
3
4
5
6
#--------------------------------------------
# 这是一个注释
# author:
# file name:
# description:
#--------------------------------------------

三、功能性语句

1. readonly

1
readonly Variable # Variable为变量名称

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

2. unset

1
unset Variable # Variable为变量名称

该命令可以删除已经定义的变量。

3. read

3.1使用格式

read 用来从标准输入中读取数据并赋值给变量。如果没有进行重定向,默认就是从键盘读取用户输入的数据;如果进行了重定向,那么可以从文件中读取数据。

1
read [option] [Variables]
[option] -a array 把读取的数据赋值给数组 array,从下标 0 开始
-d delimiter 用字符串 delimiter 指定读取结束的位置,而不是一个换行符(默认结束符号为换行符,读取到的数据不包括 delimiter)。
-n num 读取 num 个字符就结束,而不是整行字符。如果没有读满 num 个字符就按下回车或遇到换行符,则也会结束读取。
-N num 严格要求读满 num 个字符才自动结束读取,即使中途按下了回车或遇到了换行符也不结束,其中换行符或回车算一个字符。
-p prompt 显示提示信息,提示内容为 prompt。默认不支持"\n"换行,要换行需要特殊处理(例如:通过 $'string \n' 就可以实现换行输入)
-t timeout 设置超时时间,单位为秒。如果用户没有在指定时间内输入完成,那么 read 将会返回一个非 0 的退出状态,表示读取失败,即使已经输入了一部分。
-u fd 使用文件描述符 fd 作为输入源,而不是标准输入,类似于重定向。
-e 在输入的时候可以使用命令补全功能(Tab键)。
-r 原样读取(Raw mode),不把反斜杠字符解释为转义字符,这意味着"\"会变成文本的一部分。
-s 静默模式(Silent mode),不会在屏幕上显示输入的字符。可用于输入密码和其它确认信息的时候。
[Variables] 变量名称

【注意】

(1)可以使用多个参数。

(2)变量读取说明

1
read [-ers] [-a aname] [-d delim] [-i text] [-n num] [-N num] [-p prompt] [-t timeout] [-u fd] [var_name1 var_name2 ...]

首先说一下 IFS(internal field separator ,为内部字段分隔符,是 bash shell 中的环境变量,它定义了 bash shell 用作字段分隔符的一系列字符,默认情况下, bash shell 会将下列字符当做字段分隔符:空格制表符换行符

read 命令用于从标准输入中读取输入单行,并将读取的单行根据 IFS 环境变量分裂成多个字段,并将分割后的字段分别赋值给指定的变量列表 var_name 。第一个字段分配给第一个变量 var_name1 ,第二个字段分配给第二个变量 var_name2 ,依次到结束。如果指定的变量名少于字段数量,则多出的字段数量也同样分配给最后一个 var_name ,如果指定的变量命令多于字段数量,则多出的变量赋值为空。如果没有指定任何 var_name ,则分割后的所有字段都存储在环境变量 REPLY 中。

3.2使用实例

1
2
3
#!/bin/bash
read -p $'Enter your name: \n'
echo $REPLY

运行结果:

1
2
3
Enter your name: 
qidaink
qidaink

(3)给多个变量赋值时,必须在一行内输入所有的值,不能换行,否则只能给第一个变量赋值,后续变量都会赋值失败。

4. test

test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。通常和 if 语句一起使用,并且大部分 if 语句都依赖 test 。

以下只为举例说明使用格式,还有一些运算符可以查看本篇笔记的《运算符》。

4.1数值测试

1
test $[num1] <关系运算符> $[num2]
运算符 -eq 等于,则为真
-ne 不等于,则为真
-gt 大于,则为真
-ge 大于等于,则为真
-lt 小于,则为真
-le 小于等于,则为真

4.2字符串测试

1
test $[num1] <字符串运算符> $[num2]
运算符 = 等于,则为真
!= 不等于,则为真
-z 字符串 字符串的长度为零,则为真
-n 字符串 字符串的长度不为零,则为真

4.3文件测试

1
test <文件测试运算符> file_name
运算符 -e file 如果文件存在,则为真
-f file 如果文件存在且可读,则为真

5. echo

5.1使用格式

echo 用于在屏幕上打印出指定的字符串,命令格式如下:

1
echo [option] string
-n 禁止在最后自动换行
-e 开启转义字符功能,即遇到以下字符进行处理,而不会将其当成一般字符输出
\a 警报,响铃
\b 退格(删除键)
\f 换页(FF),将当前位置移到下页开头
\n 换行
\c 不换行
\r 回车
\t 水平制表符(tab键)
\v 垂直制表符
\ooo 插入ooo(八进制)所代表的ASCII字符
\\ 反斜杠
--version 显示版本信息
--helo 显示帮助

【注意】该命令不带参数时自带换行

5.2使用实例

5.2.1显示普通字符串

1
2
3
4
#!/bin/bash
echo "string1"
echo "string2"
echo string3

运行结果:

1
2
3
string1
string2
string3

5.2.2显示转义字符

1
2
3
#!/bin/bash
echo "\"string\""
echo \"string\"

运行结果:

1
2
"string"
"string"

5.2.3显示变量

1
2
3
4
5
#!/bin/bash
name=qidaink
echo $name
echo "$name"
echo "${name}"

运行结果:

1
2
3
qidaink
qidaink
qidaink

5.2.4显示换行与不换行

1
2
3
4
5
6
7
#!/bin/bash
name=qidaink
echo -e "$name\nString1" # 开启转义字符,\n 换行
echo "$name\nString1"

echo -e "$name\c" # 开启转义字符,\c不换行
echo "String2"

运行结果:

1
2
3
4
qidaink
String1
qidaink\nString1
qidainkString2

5.2.5显示结果定向至文件

1
2
3
#!/bin/bash
name=qidaink
echo -e "$name\nString1" > file.txt

运行结果:会在当前 Shell 脚本所在目录创建一个 filt.txt 文件(无该文件的话),并将要显示的内容显示在 filt.txt 文件中。

5.2.6原样输出字符串

  • 原样输出字符串,不进行转义或取变量(用单引号)
1
2
3
4
#!/bin/bash
name=qidaink
echo "$name\nString1"
echo '$name\nString1'

运行结果:

1
2
qidaink\nString1
$name\nString1

5.2.7显示命令执行结果

1
2
3
4
#!/bin/bash
echo date
echo 'date'
echo "date"

运行结果:

1
2
3
2022年 02月 14日 星期一 13:29:17 CST
date
date

6. printf

6.1使用格式

printf 由 POSIX 标准所定义,因此使用 printf 的脚本比使用 echo 移植性好。 printf 使用引用文本或空格分隔的参数,外面可以在 printf 中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等。默认的 printf 不会像 echo 自动添加换行符。使用格式如下:

1
printf  "format-string>"  [arguments...]

其中 format-string 为格式控制字符串, arguments 为参数列表。 Shell 脚本中的 printf 和 C 语言中的 printf 用法基本一致,只是在写法上有些许区别。

  • printf 命令不用加括号
  • format-string 可以没有引号,但最好加上,单引号双引号均可。
  • 参数多于格式控制符( % )时, format-string 可以重用,可以将所有参数都转换。
  • arguments 使用空格分隔,不用逗号。

6.2 转义字符

\a 警报,响铃
\b 退格(删除键)
\c 不显示输出结果中任何结尾的换行字符,而且任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符都被忽略。
\f 换页(FF),将当前位置移到下页开头
\n 换行
\r 回车
\t 水平制表符(tab键)
\v 垂直制表符
\ooo 插入ooo(八进制)所代表的ASCII字符
\\ 反斜杠字符

6.3 格式控制字符串

6.3.1格式控制字符

格式字符 形式 意义
i, d %i, %d 以十进制形式输出带符号整数(正数不输出符号)
u %u 以十进制形式输出无符号整数
o %o 以八进制形式输出无符号整数(不输出前缀0)
x, X %x, %X 以十六进制形式输出无符号整数(不输出前缀0x)
f %f 以小数形式输出单、双精度实数
e, E %e, %E 以指数形式输出单、双精度实数
g, G %g, %G 以 %f 或 %e 中较短的输出宽度输出单、双精度实数
c %c 输出单个字符
s %s 输出字符串

6.3.2标识

标识 描述
- 在给定的字段宽度内左对齐,默认是右对齐
+ 强制在结果之前显示加号或减号(+ 或 -),即正数前面会显示 + 号。默认情况下,只有负数前面会显示一个 - 号。
space
(空格)
有符号值若为正,则在值前显示前导空格(但是不显示符号);若为负,则在值前显示-。
# 与 o、x 或 X 说明符一起使用时,非零值前面会分别显示 0、0x 或 0X。
与 e、E 和 f 一起使用时,会强制输出包含一个小数点,即使后边没有数字时也会显示小数点。默认情况下,如果后边没有数字时候,不会显示显示小数点。
与 g 或 G 一起使用时,结果与使用 e 或 E 时相同,但是尾部的零不会被移除。
0 输出数值时指定左面不使用的空位置自动填0。

6.3.3最小输出宽度( width )

宽度 描述
number 数值(十进制整数),数据长度 小于number,则左补空格;否则按实际输出。
* 星号,精度在 format 字符串中未指定,但是会作为附加整数值参数放置于要被格式化的参数之前。

6.3.4精度( .precision )

精度 描述
.number 对于整数说明符(d、i、o、u、x、X):precision 指定了要写入的数字的最小位数。如果写入的值短于该数,结果会用前导零来填充。如果写入的值长于该数,结果不会被截断。精度为 0 意味着不写入任何字符。
对于 e、E 和 f 说明符:要在小数点后输出的小数位数。
对于 g 和 G 说明符:要输出的最大有效位数。
对于 s : 要输出的最大字符数,不足number则正常输出,超过则截断。默认情况下,所有字符都会被输出,直到遇到末尾的空字符。
对于 c 类型:没有任何影响。
当未指定任何精度时,默认为 1。如果指定时不带有一个显式值,则假定为 0。
.* 星号,精度在 format 字符串中未指定,但是会作为附加整数值参数放置于要被格式化的参数之前。
但是在尝试的时候似乎有一些数据类型不匹配的情况,不过也用的不多。

6.4使用实例

1
2
3
4
5
#!/bin/bash
printf "%-10s %-8s %-4s\n" name sex kg
printf "%-10s %-8s %-4.1f\n" qidai 男 72.162
printf "%-10s %-8s %-4.1f\n" fanhua 男 60.9612
printf "%-10s %-8s %-4.1f\n" yunyuhai 女 48.96313141

四、结构性语句

结构性语句主要根据程序的运行状态、输入数据、变量的取值、控制信号以及运行时间等因素来控制程序的运行流程。主要包括:条件测试语句(两路分支)、多路分支语句、循环语句、循环控制语句和后台执行语句等。

1.分支语句

1.1 if…else… 语句

1.1.1使用格式1

  • 语法结构 1
1
2
3
4
5
6
7
8
9
10
11
12
13
# if ... fi 结构
if [ expression ]
then
Statement(s) to be executed if expression is true
fi

# 或者
if [ expression ] ; then
Statement(s) to be executed if expression is true
fi

# 或者写成一行
if [ expression ] ; then Statement(s) to be executed if expression is true; fi;

1.1.2使用格式2

  • 语法结构 2
1
2
3
4
5
6
7
# if ... else ... fi 结构
if [ expression ]
then
Statement(s) to be executed if expression is true
else
Statement(s) to be executed if expression is not true
fi

1.1.3使用格式3

  • 语法结构 3
1
2
3
4
5
6
7
8
9
10
11
12
13
# if ... elif ... fi 结构
if [ expression 1 ]
then
Statement(s) to be executed if expression 1 is true
elif [ expression 2 ]
then
Statement(s) to be executed if expression 2 is true
elif [ expression 3 ]
then
Statement(s) to be executed if expression 3 is true
else
Statement(s) to be executed if no expression is true
f

【注意】

(1)以上三种结构中, if 和 elif 之后要跟一个 then ,结束要有 fi ,中间的执行语句不需要像 C语言 一样有 {} 。

(2) then 可以与 if 或者 elif 写在同一行,但是要加一个 ;

(3) if 也常与 test 命令一起使用。

1.2 case 语句

1.2.1使用格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
case 值 in
模式1)
command1
command2
command3
;;
模式2)
command1
command2
command3
;;
*)
command1
command2
command3
;;
esac

【注意】

(1)取值后面必须为单词 in ,每一模式必须以右括号结束。取值可以为变量或常数,匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;; 。

(2)每个 case 分支用右圆括号开始,用两个分号 ;; 表示 break ,即执行结束。如果没有匹配到任何一个模式,使用星号 * 捕获该值,再执行后面的命令。

(3) esac (就是 case 反过来)作为整个结构结束标记。

1.2.2使用实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash

read -p "Inter a number:" value
if [ $value -lt 0 ] || [ $value -gt 100 ]
then
echo "input error."
exit 0
else
value= expr $value / 10
case $value in
8 | 9 | 10)
echo "A"
;;
6 | 7)
echo "B"
;;
*)
echo "C"
;;
esac
fi

2.循环语句

2.1 for 循环

2.1.1使用格式1

  • 语法结构 1
1
2
3
4
5
6
7
for 变量 in 列表
do
command1
command2
...
commandN
done

2.1.2使用格式2

  • 语法结构 2
1
2
3
4
5
6
7
for((表达式1; 表达式2; 表达式2))
do
command1
command2
...
commandN
done

【注意】

(1)以上两种结构都可以,但是都要注意不可省略 do 和 done 。

2.1.3使用实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
printf "\033[31m shell方式 \033[0m\n"
for value in 1 2 3 4 5
do
printf "$value"
done
echo ""

printf "\033[31m 类似C语言方式 \033[0m\n"
for ((val = 1; val <=5; val++))
do
printf "$val"
done
echo ""

2.2 while 循环

2.2.1使用格式1

  • 语法结构 1
1
2
3
4
while [ expression ]
do
Statement(s) to be executed if expression is true
done

2.2.2使用格式2

  • 语法结构 2
1
2
3
4
while (( expression )) 
do
Statement(s) to be executed if expression is true
done

2.2.3使用实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash
# 语法结构1例子
i=1
sum=0
while [ $i -le 10 ]
do
sum= expr $sum + $i
i= expr $i + 1
done
echo "i = $i sum = $sum"

# 语法结构2例子
num=0
while (( $num < 5))
do
echo "$num"
num= expr $num + 1
done
echo "num=$num"

2.3 until 循环

until 循环执行一系列命令直至条件为 true 时停止。 until 循环与 while 循环在处理方式上刚好相反。一般 while 循环优于 until 循环,但在某些时候—也只是极少数情况下, until 循环更加有用。

2.3.1使用格式

  • 语法结构
1
2
3
4
until [ expression ]
do
Statement(s) to be executed until command is true
done

2.3.2使用实例

1
2
3
4
5
6
7
#!/bin/bash
num=0
until [ ! ${num} -lt 3 ]
do
echo ${num}
num= expr ${num} + 1
done

2.4无限循环写法

2.4.1 for

1
2
3
4
5
# for写法
for (( ; ; ))
do
command
done

2.4.2 while

1
2
3
4
5
6
7
8
9
10
11
# while写法1
while :
do
command
done

# while写法2
while true
do
command
done

2.5跳出循环

2.5.1使用格式

在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环, Shell 与 C 语言一致,使用两个命令来实现该功能: break 和 continue 。用法与 C 语言一致。

【注意】

(1)一般来说 break 是跳出本层循环, continue 是结束本次循环,直接进入下一次循环。

(2)在嵌套循环中, break 命令后面还可以跟一个整数,表示跳出第几层循环。 continue 后边也可以跟一个整数,表示继续第几层循环。

1
2
break n      # break所在循环层为第1层,然后再向外计算层数
continue n # continue所在循环层为第1层,然后再向外计算层数

2.5.2使用实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/bash
for var1 in 1 2
do
echo "第1层循环 var1=${var1}"
for var2 in 3 4
do
echo -e "\t第2层循环 var2=${var2}"
for var3 in 5 6
do
if [ ${var1} == 1 ] && [ ${var2} == 4 ] && [ ${var3} == 5 ]
then
echo -e "break 跳出"
break 3
elif [ ${var1} == 1 ] && [ ${var2} == 3 ] && [ ${var3} == 5 ]
then
echo -e "continue 继续"
continue 3
fi
echo -e "\t\t第3层循环 var3=${var3}"
echo -e "\t\t一次循环结束 ${var1} ${var2} ${var3}"
done
done
done

3.三目运算符?

3.1使用格式

我也不知道叫啥,其实就很类似于条件语句:

1
2
3
4
command1 && command2 || command3

command1 && { command2_1; command2_2; command2_3;} || { command3_1; command3_3; command3_3;}

3.2 使用实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# fileName 文件不存在,则退出,就可以按照下面方式执行
[ -e $fileName ] || { echo -e "fileName Not existed!"; exit 1; }

#也或者可以增加一些 log 打印信息
[ -e $fileName ] && echo -e "$fileName existed" || { echo -e "$fileName Not existed!"; exit 1; }

#多个命令集合的组合
[ -e $fileName ] && echo -e "$fileName existed"; ehco -e "Other Necessary Information" || { echo -e "$fileName Not existed!"; exit 1; }
[ -e $fileName ] && { echo -e "$fileName existed"; ehco -e "Other Necessary Information"; } || { echo -e "$fileName Not existed!"; exit 1; }

#读取IP地址,若为空,则使用默认IP,否则使用新的IP地址
read -p "Please input Management IP (Default is $DEFAULT_IP): " MGMT_IP
[[ -z $MGMT_IP ]] && { MGMT_IP=$DEFAULT_IP; echo -e "Using default IP $MGMT_IP\n" ;} || DEFAULT_IP=$MGMT_IP

五、 Shell 中带颜色的输出

1. ANSI 控制码简介

ANSI 控制码用于在字符显示系统中控制光标移动和字符色彩等,常用于 BBS 系统中。 ANSI ESCAPE SEQUENCES 又称为 VT100 系列控制码,国内译为 ANSI 控制码。 ANSI 控制码依赖终端,不是依赖语言,所以在 shell , perl , C 里应用都是可以的。

ANSI 控制码开始的标志都为 ESC[ , ESC 对应 ASCII码表 的 033(八进制) ,在 Shell 编程中,输出的命令有 echo 和 printf , echo 需要用 -e 启用转义,两个输出命令通过 \033或者\e 来输入 ESC ,例如 \033[32m 即为 ESC[32m 。

2. ANSI 控制码

\033[0m 关闭所有属性
\033[1m 设置高亮度
\033[4m 下划线
\033[5m 闪烁
\033[7m 反显
\033[8m 消隐
\033[30m ~ \033[37m 设置前景色(字体色)
30:黑 31:红 32:绿 33:黄 34:蓝 35:紫 36:深绿 37:白
\033[40m ~ \033[47m 设置背景色
40:黑 41:红 42:绿 43:黄 44:蓝 45:紫 46:深绿 47:白
\033[nA 光标上移n行
\033[nB 光标下移n行
\033[nC 光标右移n行
\033[nD 光标左移n行
\033[y;xH 设置光标位置,将光标移动到y行x列的位置
\033[2J 清屏,光标移到左上角
\033[K 清除从光标到行尾的内容
\033[s 保存光标位置
\033[u 恢复光标位置
\033[?25l 隐藏光标
\033[?25h 显示光标

【显示字符属性控制】

1
[n1;n2;......m

设定显示字符的属性状态。若有两个以上设定则以分号将代码隔开。除非重新设定,否则原设定之属性一直被保留,若想后边的不受影响,可以在结束后加一个 \033[0m 。

3. ANSI 码应用格式

  • echo
1
echo -e "\033[颜色值m 文本" # 最后加上\033[0m可以使其不影响其他字体 
  • printf
1
printf  "\033[颜色值m 文本\n" # 最后加上\033[0m可以使其不影响其他字体 

4.使用实例

4.1 echo

1
2
3
4
#!/bin/bash
echo -e "\033[31m Hello World! \033[0m"
echo -e "\e[31m Hello World! \e[0m"
echo -e "\033[31;46m Hello World! \033[0m"

输出效果:

4.2 printf

1
2
3
4
#!/bin/bash
printf "\033[31m Hello World! \033[0m Hello World!\n"
printf "\e[31m Hello World! \e[0m Hello World!\n"
printf "\033[31;46m Hello World! \033[0m Hello World!\n"

输出效果:

4.3 自用变量定义

1
2
3
4
5
6
7
8
9
10
11
12
13
BLACK="\033[1;30m"
RED='\033[1;31m' # 红
GREEN='\033[1;32m' # 绿
YELLOW='\033[1;33m' # 黄
BLUE='\033[1;34m' # 蓝
PINK='\033[1;35m' # 紫
CYAN='\033[1;36m' # 青
WHITE='\033[1;37m' # 白
CLS='\033[0m' # 清除颜色

INFO="${GREEN}[INFO]${CLS}"
WARN="${YELLOW}[WARN]${CLS}"
ERR="${RED}[ERR ]${CLS}"