read命令
read命令用于从标准输入(键盘)中读取输入单行,并将读取的单行根据IFS变量分裂成多个字段,并将分割后的字段分别赋值给指定的变量列表var_name。第一个字段分配给第一个变量var_name1,第二个字段分配给第二个变量var_name2,依次到结束。如果指定的变量名少于字段数量,则多出的字段数量也同样分配给最后一个var_name,如果指定的变量命令多于字段数量,则多出的变量赋值为空。
如果没有指定任何var_name,则分割后的所有字段都存储在特定变量REPLY中。
read命令 -p(提示语句) -n(字符个数) -t(等待时间) -s(不回显)
<1>使用-p选项给出输入提示。"-p"选项默认不带换行功能,且也不支持"\n"换行。但通过$'string'的方式特殊处理,就可以实现换行的功能。例如:
[root@server script]# read -p $'Enter your name: \n'
Enter your name:
mine[root@server script]# echo $REPLY ##输入的字段存储在变量REPLY中
mine
<2>使用-n选项给出限制读取的字符个数。读取n个字符就自动结束读取,如果没有读满n个字符就按下回车或遇到换行符,则也会结束读取。例如:
[root@server script]# read -n 5
abcde[root@server script]# echo $REPLY
abcde
<3>使用-t选项给出超时时间,在达到超时时间时,read退出并返回错误。也就是说不会读取任何内容,即使已经输入了一部分。在超时时间结束之前完成输入并按回车返回则可以完成该输入操作。
[root@server script]# read -t 5
123[root@server script]# echo $REPLY ##在达到超时时间后不会读取任何内容
<4>使用-s进入静默模式。输入的内容不会回显在屏幕上。
[root@server script]# read -s
[root@server script]# echo $REPLY
123
test命令
功能:检查文件和比较值
Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
test 命令和 [ ] 等同
[ "a" == "b"] 等同于 test a ==b
1)对字符串进行判定
判定方式 | 含义 |
test -z string / [ -z string] | 判定字串是否为 0 若 string 为空字串,则为 true |
test -n string / [ -n string] | 判定字串是否非为 0 若 string 为空字串,则为 false -n 亦可省略 |
test str1 == str2 / [ str1 == str2 ] | 判定 str1 是否等于 str2 ,若相等,则回传 true |
test str1 != str2 / [ str1 != str2 ] | 判定 str1 是否不等于 str2 ,若相等,则回传 false |
[root@server ~]# A=abc
[root@server ~]# echo $A
abc
[root@server ~]# test -z A ##判断A是否为空串
[root@server ~]# echo $?
1
[root@server ~]# test -n A ##判断A是否为非空串
[root@server ~]# echo $?
0[root@server ~]# test abc == aaa ##判断字符串abc与aaa是否 相等
[root@server ~]# echo $?
1
2)两个整数之间的判定
判定方式 | 含义 |
-eq | 两数值相等 (equal) |
-ne | 两数值不等 (not equal) |
-gt | n1 大于 n2 (greater than) |
-lt | n1 小于 n2 (less than) |
-ge | n1 大于等于 n2 (greater than or equal) |
-le | n1 小于等于 n2 (less than or equal) |
== | 两数值相等 (equal) |
!= | 两数值不等 (not equal) |
test "$a" -lt "$b" 等同于 [ "$a" -lt "$b" ]
练习
判断输入的数字是否在10以内
1.输入是否为空
2.是否在10以内
3.0<$a<10 --> yes
4.$a<0 $a>10 --> no
[root@server script]# vim num.sh
#!/bin/bash
[ -z "$1" ] && {
echo "please input a number:"
exit 1
}
[ "$1" -gt "0" -a $1 -lt "10" ] && {
echo "YES"
} || {
echo "NO"
}
执行程序的结果:
3)对于某个文件的“文件类型”判断,如 test -e filename 表示存在否
判定方式 | 含义 |
-e | 该文件是否存在 |
-f | 该文件是否为普通文件(file) |
-d | 该文件是否为目录(directory) |
-b | 该文件是否为块设备(block device) |
-c | 该文件是否为字符串设备(character device) |
-S | 该文件是否为套接文件(Socket) |
-L | 该文件是否为链接(软链接)文件 |
test -e filename 等同于 [ -e filename ]
练习
判断一个输入的文件是否存在,并判断文件类型
[root@server script]# vim file.sh
#!/bin/bash
[ -e "$1" ] || { #判断文件是否存在
echo "$1" is not exist!!
exit 1
}
[ -L "$1" ] && { #判断文件是否是链接文件
echo "$1" is a link
exit 0
}
[ -f "$1" ] && { #判断文件是否为普通文件
echo "$1" is a regular file
}
[ -d "$1" ] && { #判断文件是否目录
echo "$1" is a directory
}
[ -b "$1" ] && { #判断文件是否为设备文件系统
echo "$1" is a block special
}
[ -c "$1" ] && { #判断文件是否为字符设备
echo "$1" is a character special
}
[ -S "$1" ] && { #判断文件是否为套接字
echo "$1" is a socket
}
执行该脚本文件,结果如下:
[root@server script]# sh file.sh /etc/passwd
/etc/passwd is a regular file[root@server script]# sh file.sh /dev/pts
/dev/pts is a directory[root@server script]# sh file.sh /dev/pts/ptmx
/dev/pts/ptmx is a character special[root@server script]# sh file.sh /var/lib/mysql/mysql.sock
/var/lib/mysql/mysql.sock is a socket[root@server script]# sh file.sh /etc/rc.local
/etc/rc.local is a link[root@server script]# sh file.sh /dev/vda1
/dev/vda1 is a block special[root@server script]# sh file.sh /etc/pass
/etc/pass is not exist!!
4)多重条件判定
判定方式 | 含义 |
-a | (and)两状况同时成立!例如 test -r file -a -x file则 file 同时具有 r 与 x 权限时,才回传 true。 |
-o | (or)两状况任何一个成立!例如 test -r file -o -x file,则 file 具有 r 或 x 权限时,就可回传 true。 |
[ "$a" -ne "$b" -a "$a" -gt "$b" ] a不等于b且a大于b时返回true
[ "$a" -ne "$b" -o"$a" -gt "$b" ] a不等于b或a大于b时返回true
[root@server script]# [ 1 -ne 2 -a 3 -lt 4 ]
[root@server script]# echo $?
0
[root@server script]# [ 1 -eq 2 -o 3 -eq 4 ]
[root@server script]# echo $?
1
5)两个文件之间的比较,如:test file1 -nt file2
判定方式 | 含义 |
-nt | (newer than)判断 file1 是否比 file2 新 |
-ot | (older than)判断 file1 是否比 file2 旧 |
-ef | 判断 file1 与 file2 是否为同一文件,可用在判断hard link(硬链接) 的判定上。主要意义在判定,两个文件是否均指向同一个 inode |
sort命令
功能:将文本文件内容加以排序,sort可针对文本文件的内容,以行为单位来排序。
sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。
sort后接的参数及其解释
-f :忽略大小写的差异,例如 A 与 a 视为编码相同;
-b :忽略最前面的空白字符部分;
-M :以月份的名字来排序,例如 JAN,DEC 等等的排序方法;
-n :使用“纯数字”进行排序;
-r :反向排序;(注:不加-n参数时仍然是逐字符按其ASCII码值进行比较)
-u :就是 uniq,相同的数据中,仅出现一行代表;(即去掉重复数字)
-t :分隔符号,默认是用 [tab] 键来分隔;
-k :指定要排序的列,以那个区间 (field) 来进行排序的意思
[root@server script]# sort -nt : -k 2 test ##以:为分隔符对test文件的第二列按纯数字大小进行排序
-o:输出到指定文件中
[root@server script]# sort -nt : -k 2 test -o /mnt/file ##将排序结果输出到/mnt/file文件中
cut命令
cut命令将行按指定的分隔符分割成多列,它的弱点在于不好处理多个分隔符重复的情况,因此经常结合tr的压缩功能。
cut 命令用于按“列”提取文本字符,格式为“cut [参数] 文本”
cut后接的参数及其说明
-b
:按字节筛选;-n
:与"-b"选项连用,表示禁止将字节分割开来操作;-c
:按字符筛选;-f
:按字段筛选;-d
:指定字段分隔符,不写-d时的默认字段分隔符为"TAB";因此只能和"-f"选项一起使用。-s
:避免打印不包含分隔符的行;--complement
:补足被选择的字节、字符或字段(反向选择的意思或者说是补集);--output-delimiter
:指定输出分割符;默认为输入分隔符。
示例:
cut -d : -f 1-3 /etc/passwd ##指定分隔符为":",显示第1到3列
cut -c 1,4 /etc/passwd ##显示第一和第四个字符
练习1:截取主机的ip地址
[root@server script]# ifconfig eth0 | grep "inet " | cut -d " " -f 10
172.25.254.100
练习2:截取某目录中文件大小最大的文件名
[root@server script]# ll -S | head -2 | cut -d " " -f 9
log_2018-12-24.tar.gz
[root@server script]# ll | sort -nt " " -k 5 | tail -1 | cut -d " " -f 9
log_2018-12-24.tar.gz
&&, ||
- &&
在 Shell 终端中逻辑“与”的运算符号是&&,它表示当前面的命令执行成功后才会执行它后面的命令- ||
在 Shell 终端中逻辑“或”的运算符号是 ||,表示当前面的命令执行失败后才会执行它后面的命令
&&相当于“if...then...”,而||相当于“if not...then...”。&&和||用于连接两个命令,⽽上⾯讲的-a和-o仅 ⽤用于在测试表达式中连接两个测试条件,要注意它们的区别
练习:
编写脚本,查看当前的网络状态。当ping命令可以ping通时,即显示对应的网络状态is up, 否则为down.
[root@server script]# vim network.sh
#!/bin/bash
ping -c1 -w1 172.25.254.$1 &> /dev/null && echo 172.25.254.$1 is up || echo 172.25.254.$1 is down
执行脚本查看结果:
uniq命令
uniq 对重复字符作相应处理,一般与排序进行连用
uniq后接的参数及其说明:
-c或--count 在每列旁边显示该行重复出现的次数。
-u或--unique 仅显示出一次的行列。
-d或--repeated 仅显示重复出现的行