shell脚本应用(四)

  1. Shell环境根据命令执行后的返回状态值($?)来判断是否执行成功,当返回值为0是表示成功,不然(非0值)表示失败或者异常。使用专门的测试工具-test命令,能够对特定条件进行测试,并根据返回值来判断条件是否成立(返回值为0时表示条件成立);
    ide


使用test测试命令时,包括如下两种形式。
工具

test  条件表达式测试

或者spa

[ 条件表达式 ]server

这两种方式的做用彻底相同,但一般后一种形式更为经常使用,注意中括号括起来时至少要用一空格来分隔。内存


文件测试:
ci

文件测试的常见选项以下:字符串

-d:测试是否为目录(Directory)it

-e:测试目录或文件是否存在(Exist)class

-f:测试是否为文件(File)

-r:测试当前用户是否有权限读取(Read)

-w:测试当前用户是否有权限写入(Write)

-x:测试当前用户是否有权限执行(EXcute)

执行条件测试后经过预约义变量“$?”能够得到测试命令的返回状态值。从而判断条件是否成立。

例:执行下列操做可测试目录/media/cdrom是否存在,若是返回值$?为0,表示存在此目录不然则不存在,或虽然存在但不是目录。



[root@dbserver ~]# [ -d /media/cdrom ]


[root@dbserver ~]# echo $?    //查看当前一命令的返回值

1                             //返回1表示条件不成立

[root@dbserver ~]# [ -d /media ]

[root@dbserver ~]# echo $?     //查看当前一命令的返回值

0                                //返回0表示条件成立


 为了更直观的查看测试结果,能够结合命令输出符“&&”和echo命令一块儿使用,当条件成立时直接输出"yes",其中"&&"表示"并且"的关系,只有当前面的命令成功执行后才会执行后面的命令,不然后面的命令将会被忽略。例:上面的测试结果能够改成:


[root@dbserver ~]# [ -d /media/cdrom ]  && echo "yes"  //无输出表示该目录不存在

[root@dbserver ~]# [ -d /media ]  && echo "yes"       //输出"yes"表示该目录存在

yes


2.整数值得对比:整数值得比较指的是给定的两个整数值,判断第一个数与第二个数的关系,好比是否大于等于小于第二个数,整数值比较的经常使用选项以下。

-eq:第一个数等于第二个数

-ne:第一个数不等于第二个数

-gt:第一个数大于第二个数

-lt:第一个数小于第二个数

-le:第一个数小于或等于第二个数

-ge:第一个数大于等于第二个数

例:当判断已经登录的用户,当小于五个时输出"Too many",能够执行如下操做。


[root@dbserver ~]# Unum=`who |wc -l`

[root@dbserver ~]# [ $Unum  -lt 5 ]  && echo "Too many"

Too many


再举个例子,当内存大于1024MB时输出如下值:


[root@dbserver ~]# FreeCC=$(free -m  | grep "cache:"  | awk  '{print $ 4}')

[root@dbserver ~]# [ $FreeCC -gt 1024 ] && echo ${FreeCC}MB

1648MB


4.字符串比较:字符串比较一般用于检查用户的输入,系统环境等是否知足条件;

=:第一个字符串与第二个字符串相同;

!=:第一个字符串与第二个字符串不一样,其中!表示取反;

-z:检查字符串是否为空值;

例:判断当前的语言环境是否为zh.CN;


[root@dbserver ~]# echo $LANG

en_US.UTF-8

[root@dbserver ~]# [ $LANG != "zh_CN" ]  && echo "not zh.CN"

not zh.CN


再例如,在Shell脚本应用中,常常输入yes或者no来确认某个任务,如下操做展现了确认交互的简单过程:


[root@dbserver ~]# read -p "是否覆盖现有文件(yes/no)?" ACK

是否覆盖现有文件(yes/no)?yes

[root@dbserver ~]# [ $ACK = "yes" ] && echo “覆盖”

“覆盖”

[root@dbserver ~]# read -p "是否覆盖现有文件(yes/no)?" ACK

是否覆盖现有文件(yes/no)?no 

[root@dbserver ~]# [ $ACK = "no" ] && echo 不覆盖

不覆盖


4.逻辑测试:指的是判断两个或多个条件之间的依赖关系,当系统任务取决于多个不一样的条件时,根据这些条件是否同时成立或者其中一个成立等状况,须要一个测试的过程,经常使用的逻辑测试操做以下;

&&:逻辑与,表示“并且”,只有当先后两个条件都成立时,整个测试命令的返回值才为0(结果成立);

||:逻辑或,表示“或者”,只要当指定的条件不成立时,整个测试的返回值才为0(结果成立),使用test命令测试时,||可改成"-o";

!:逻辑否,表示“不”,只有当条件不成立时,整个测试命令的返回值为0(但结果是成立的);

例:若要判断当前Linux系统内核版本是否大于2.4,可执行如下操做;


[root@dbserver ~]# uname -r

2.6.32-431.el6.x86_64

[root@dbserver ~]# Mnum=$(uname -r| awk -F. '{print $1}')

[root@dbserver ~]# Snum=$(uname -r| awk -F. '{print $2}')

[root@dbserver ~]# [ $Mnum -eq 2 ] && [ $Snum -gt 4 ]   && echo "符合要求"

符合要求


下次写点if语句,我这都是基础的,慢慢写点难度大的,我就是个渣渣,哈哈