shell编程入门--基本命令

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 仅显示重复出现的行

猜你喜欢

转载自blog.csdn.net/weixin_40172997/article/details/85245326