本文主要是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 用于在屏幕上打印出指定的字符串,命令格式如下:
-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
运行结果:
5.2.2显示转义字符 1 2 3 # !/bin/bash echo "\"string\"" echo \"string\"
运行结果:
5.2.3显示变量 1 2 3 4 5 # !/bin/bash name=qidaink echo $name echo "$name" echo "${name}"
运行结果:
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 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
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
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 2 3 4 5 6 7 for 变量 in 列表 do command1 command2 ... commandN done
2.1.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 2 3 4 while [ expression ] do Statement(s) to be executed if expression is true done
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 写法1while : do command done # while 写法2while 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
显示光标
【显示字符属性控制】
设定显示字符的属性状态。若有两个以上设定则以分号 将代码隔开。除非重新设定,否则原设定之属性一直被保留,若想后边的不受影响,可以在结束后加一个 \033[0m 。
3. ANSI 码应用格式
1 echo -e "\033[颜色值m 文本" # 最后加上\033[0m可以使其不影响其他字体
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}"