bash的算术运算和条件测试语句
1.wc:
2.cut命令:
cut - 在文件的每一行中提取片断
注意:能够被cut命令修剪的文件或数据内容,一般是具有某种特定格式会或结构文本文件或数据内容;
格式:cut [OPTION]... [FILE]...
常用选项:
-d, --delimiter=DELIM:指定在实施修剪操作时使用的字段分隔符号,默认是TAB
(空白字符);
-f, --fields=LIST:根据指定的字段分隔符号来指定要保留的字段编号的列表;
LIST称为字段列表,地址定界,书写方法:
1. NUM:选择被指定的单个数字所表示的字段,该字段将被保留;
2. NUM1,NUM2,NUM3,....:离散的多个被指定的字段的数字的列表,所有数值所代表的字段都被保留;
3. NUM1-NUM2:连续的多个被指定的字段的数字列表,所有数值代表的字段均被保留;
4. NUM1-:从NUM1开始直到行尾的所有字段;
5. -NUM2:从行首第一个字段到NUM2字段结束的所有字段;
--output-delimiter=STRING:指定输出数据时的字段分割符号;
例:
[root@localhost ~]# cut -d":" -f 1 /etc/passwd
root
bin
daemon
adm
lp
[root@localhost ~]# df | tr -s ' '| cut -d " " -f 2-4
1K-块 已用 可用
9754624 3512660 6241964
485168 0 485168
499860 0 499860
499860 7332 492528
499860 0 499860
191140 138508 52632
99972 4 99968
99972 24 99948
99972 0 99972
3.awk:
gawk - pattern scanning and processing language
常用选项:
-F fs--field-separator fs:指定字段分割符,默认空白字符;
对于awk,根据字符分割符切分出来的名字段,分别使用$1,$2,$3,...$NF来进行识别,$1是awk的内部变量;
格式:awk|gawk [Options]... '/PATTERN/{print $1,$2}'
例:
[root@localhost ~]# df | awk '{print $1,$2}'
文件系统 1K-块
/dev/sda3 9754624
devtmpfs 485168
tmpfs 499860
tmpfs 499860
tmpfs 499860
/dev/sda1 191140
tmpfs 99972
tmpfs 99972
tmpfs 99972
4.sort:
sort - sort lines of text files
对于指定文件中的行,按照ASCII编码表中的字符顺序进行排序输出;
格式:
sort [OPTION]... [FILE]...
常用选项:
-n:以数字的数值大小作为排序依据进行排序;
-r:倒序显示排序结果;
-R:随机排序,简陋,不适合复杂环境的排序要求;
-u:重复出现的行只出现一次,去重:连续且相同的行为重复行;
-t:指定字段分隔符;
-k:指定根据哪个关键字字段进行排序,一般和-t同时使用;
例:
[root@localhost ~]# sort -n -t " " -k 1 /etc/passwd|head -2
abrt:x:173:173::/etc/abrt:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
例:选出12 13 14的最大值和最小值
[root@localhost ~]# vim 1
12 13 14
[root@localhost ~]# cat 1 | tr ' ' '\n'|sort -r | head -1
14
[root@localhost ~]# cat 1 | tr ' ' '\n'|sort -r | head -3 | tail -1
12
5.uniq
uniq - 删除排序文件中的重复行
注意:uniq命令本身不具有排序功能;
格式:
uniq [OPTION]... [INPUT [OUTPUT]]
常用选项:
-c, --count:计算重复行的重复次数;
-d, -repeated:显示重复行,只显示一行;
-u, --unique:仅显示无重复行;
例:
[root@localhost ~]# vim 1
[root@localhost ~]# cat 1
12 13 14
12 13 14
1
1
[root@localhost ~]# cat 1 | uniq -c -d
2 12 13 14
2 1
6.diff
diff - 找出两个文件的不同点(逐行比较两个文件的内容)
格式:
diff [option] 源文件 目标文件
制作patch文件:
# diff file1 file2 > patch_file
注意:patch_file中记录的是file1和file2文件相比有哪些不同;使用patch_file时,
应该向file1打补丁;
例:
[root@localhost ~]# vim 0
[root@localhost ~]# cat 0
12 13 14 15
22 33 44 55
123456789
[root@localhost ~]# vim 1
[root@localhost ~]# cat 1
12 13 14
12 13 14
123456789
[root@localhost ~]# diff 0 1
1,3c1,3
< 12 13 14 15
< 22 33 44 55
< 123456789
---
> 12 13 14
> 12 13 14
> 123456789
7.patch
patch - apply changes to files
格式:
patch [-blNR][ -c| -e| -n][-d dir][-D define][-i patchfile]
[-o outfile][-p num][-r rejectfile][file]
常用选项:
-i patchfile or --input=patchfile:用于指明patch文件的路径;
条件测试命令:
test命令==[ 命令,bash的内置命令;
格式:
test expression
[ expression ]
[[:bash的关键字,一般仅用于某些特定结构或格式之中;
` expression `
注意:此类条件测试命令一般没有执行结果,仅有执行状态返回值,如果其执行状态返回值为0,表示ture,为1,则表示false;
条件测试命令共有的三类条件测试表达式:
1.数值测试:双目操作;
测试操作符:
-eq:测试两个数值是否相等,相等为真,不等为假;
-ne:测试两个数值是否不等,不等为真,相等为假;
-lt:小于,测试左边数值是否小于右边数值,小于为真,不小于为假;
-gt:大于,测试左边数值是否大于右边数值,大于为真,不大于为假;
-lt:小于等于,测试左边数值是否不大于右边数值,不大于为真,大于为假;
-ge:大于等于,测试左边数值是否不小于右边数值,不小于为真,小于为假;
注意:bash仅支持整数,不支持浮点数;
2.字符串测试
1)双目测试
==|=:测试两个字符串是否为相同的字符串;相同为真,不同为假;
!=: 测试两个字符串是否为不同的字符串,不同为真,相同为假;
>: 测试左边的字符串所对应的ASSCII编码是否比右边的字符串对应的ASCII编码大,大于为真,小于为假;
<: 测试左边的字符串所对应的ASSCII编码是否比右边的字符串对应的ASCII编码小,小于为真,大于为假;
STRING =~:测试左侧的字符串能否被右边的PATTERN匹配,能匹配为真,不能为假;
注意:>,<,=~这三类测试操作符只能用在` expression `测试语句中
2)单目测试:
-z:‘STRING’:测试STRING是否为空串,空串为真,不空为假;
-n:‘TSTRING’:测试STRING是否为非空串,非空为真,空串为假;
注意:
1.通常情况下,字符串需要用引号引用,单引号或双引号都可以,只有在特定的情况下,只能选择单引号或双引号之一;
2. []和[[]]在某些情况下,意义不完全相同,要区分对待;
3. 如果使用[]或[[]]进行条件判断,在表达式的两端都留有空白字符,以区分命令和参数之间的关系;
4. 所有的双目测试操作符和参数之间也要留有空白字符;
3.文件测试
1)单目测试:
-a|-e FILE:测试文件是否存在,存在为真,不存在为假;
-b FILE:测试文件是否存在且为块设备文件,存在且为块设备文件为真,否则为假;
-c FILE:测试文件是否存在且为字符设备文件,存在且为字符设备文件为真,否则为假;
-d FILE: 测试文件是否存在且为目录文件,存在且为目录文件为真,否则为假;
-f FILE:测试文件是否存在且为普通文件,存在且为普通文件为真,否则为假;
-h|-L FILE:测试文件是否存在且为符号链接文件,存在且为符号链接文件为真,否则为假;
-s FILE: 测试文件是否存在且其大小大于0,存在且其大小大于0为真,否则为假;
-S FILE: 测试文件是否存在且为套接字文件,存在且为套接字文件为真,否则为假;
-t FD: 测试文件描述符是否在终端上被打开,在终端上被打开为真,否则为假;
-r FILE: 测试文件是否存在且当前用户是否被授予读权限,存在且授权为真,否则为假;
-w FILE: 测试文件是否存在且当前用户是否被授予写权限,存在且授权为真,否则为假;
-x FILE: 测试文件是否存在且当前用户是否被授予执行或搜索权限,存在且授权为真,
否则为假;
文件特殊权限标识测试:
-u FILE: 测试文件是否存在且设置了SUID,存在且设置为真,否则为假;
-g FILE: 测试文件是否存在且设置了SGID,存在且设置为真,否则为假;
-k FILE: 测试文件是否存在且设置了STICKY,存在且设置为真,否则为假;
文件的所有权测试
-o FILE:测试文件是否存在且其属主这为当前有效用户,存在且属主为当前有效用户为真,
否则为假;
-G FILE:测试文件是否存在且其属主这为当前有效用户,存在且属主为当前有效用户为真,
否则为假;
2)双目测试:
FILE1 -ef FILE2:测试两个文件是否拥有相同的Inode编号,即两个文件是否互为硬链接;
测试语句中添加逻辑运算符号;
1.利用bash的逻辑运算符号;
[ expression1 ] && [expression2]
[ expression1 ] || [expression2]
! [ expression ]
2.利用条件测试命令本身的逻辑运算符号;
[ expression1 -a expression2 ]
[ expression1 -o expression2 ]
[ ! expression ]
命令的执行结果:
1.命令的正常输出结果;
2.命令的执行状态返回值;
0-255
0:表示命令执行成功或条判断为真;
1-255:表示命令执行失败或条件判断为假;
1,2,127:系统默认保留的;
3-126,128-255:用户自定义的命令执行状态返回值;
exit命令:
exit - exit the shell
格式:exit[n]
退出shell时可以使用n作为状态返回值,如果没有指定n,
则默认的状态返回值为最后一条命令的状态返回值;
注意:
当shell脚本运行时,一旦遇到exit命令,将立即结束运行次脚本的shell进程,
同时此脚本的运行也会停止,其后续所有命令都不会在被解释执行,因此,
包含了exit命令的脚本,不要使用source命令来执行;
bash的颜色显示规则:
调用了ASCII编码对于颜色的设置方案;
Ctrl键:\033
[:控制字符和颜色代码之间的分隔符;
所有的颜色代码都应该使用m结尾;
颜色代码:
0:关闭颜色显示属性,恢复为黑白色;
1:加粗显示文本字符;
4:为文本字符添加下划线;
5:文本字符闪烁;
7:将文本字符的背景颜色和前景颜色交换;
8:将文本字符的背景颜色设置为与前景颜色相同;
30-39:设置文本字符的前景色,38,39为保留,暂时未被使用;
40-49:设置文本字符的背景色,48,49为保留,暂时未被使用;
例:
注意:此类控制字符和颜色代码必须防止echo -e模式中显示;