5.条件测试操作与流程控制语句

在编写Shell脚本时候,经常需要判断两个字符串是否相等,检查文件状态或者是数字的测试等。Shell提供了对字符串、文件、数值等内容的条件测试以及逻辑流程控制。

条件测试操作

常用得测试操作
test命令,测试特定得表达式是否成立,当条件成立时,命令返回值为0,否则为其它值。

格式1test 条件表达式
格式2[ 条件表达式 ] //常用格式,使用方括号时,要注意在条件两边加上空格。

常见得测试类型:

  • 测试文件状态
  • 字符串比较
  • 整数值比较
  • 逻辑测试

测试文件

格式[ 操作符 文件或目录 ]

操作符 说明
-d 测试是否为目录 ,是则为真 (Directory)
-e 测试目录或文件是否存在,存在则为真(Exist)
-f 测试是否为文件,是则为真(file)
-r 测试当前用户是否有权限读取,是则为真(read)
-w 测试当前用户是否有权限写入,是则为真(write)
-x 测试当前用户是否可执行该文件,可执行则为真(Excute)
-L 测试是否为符号链接文件,是则为真(Link
-nt file1 -nt file2 如果 file1file2 新(修改时间),则为真
-ot file1 -ot file2 如果 file1file2 旧(修改时间),则为真

字符串比较

格式
[ String1 = String2 ]
[ String1 != String2 ]
[ -z String ]

操作符 说明
= 字符串内容相同则为真,就是说包含的文本一摸一样。
!= 字符串内容不同,则为真(!号表示相反的意思)
-z 字符串内容为空(长度为零)则为真
-n 字符串内容非空(长度非零)则为真
< string1 < string2 如果string1在本地的字典序列中排在string2之前,则为真
> string2 如果string1在本地的字典序列中排在string2之后,则为真

注意:

  • 在=前后各有一个空格,如果没有空格就是赋值的关系,不是比较的关系。
  • 字符串的> <比较运算符,一般放在[[ ]]之中,而不是test ("[]")
  • 字符串的> <比较的结果,与本地的locale有关,是按照其字典序列进行比较的

整数值比较

格式[ no1 操作符 no2 ]

操作符 说明
-eq 等于
-ne 不等于
-gt 大于
-lt 小于
-le 小于等于
-ge 大于等于

逻辑测试

格式[ 表达式1 ] 操作符号 [ 表达式2 ]

操作符 说明
-a 或 && 逻辑与、前后两个表达式都成立时整个测试结果才为真,否则为假
-o 或 || 逻辑或、操作符两边至少一个为真时,结果为真,否为为假
逻辑否 、 当制定条件不成立时,返回结果为真

流程控制语句

与其他变成语言一样,shell有自己的流程控制语句,其中包括条件语句、循环语句、选择语句等。

if条件语句

if 单分支: 当条件成立时执行相应的操作。

if 条件测试操作
  then 命令序列
fi
#!/bin/bash
# 当/boot分区的使用空间超过80%,就输出报警信息
use=`df -hT|grep "/boot" | awk '{print $5}' | cut -d "%" -f1`
if [[ $use -gt 80 ]];
  then
    echo "Warning!!/boot disk is full"
fi

if 双分支:当条件成立、条件不成立时执行不同操作。

if 条件测试命令
  then 命令序列1
  else 命令序列2
fi
#!/bin/bash
# 判断一个用户是否存在
#
No=`id -u $1`
if [[ "$No" -gt 0 ]];then
    echo "$1 is exsit"
else
    useradd $1 &> /dev/null&& echo "$1 is add"
fi

if多分枝:相当于if语句嵌套,针对多个条件执行不同操作。

if 条件测试命令1 ; then
 命令序列1
elif 条件测试命令2 ; then
 命令序列2
elif ...
else
 命令序列n
fi
#!/bin/sh
SYSTEM=`uname -s`    #获取操作系统类型,我本地是linux
if [ $SYSTEM = "Linux" ] ; then     #如果是linux的话打印linux字符串
echo "Linux"
elif [ $SYSTEM = "FreeBSD" ] ; then  
echo "FreeBSD"
elif [ $SYSTEM = "Solaris" ] ; then
echo "Solaris"
else
echo "What?"
fi     #ifend

for循环语句
根据变量的不同取值,重复执行一组命令操作。

for 变量名 in 取值列表
do
 命令序列
done
#!/bin/bash 
#
for i in 1 2 3 4 5;do  //{1..5}
    echo $i
done

while循环

重复测试指令的条件,只要条件为真则反复执行对应的命令操作,直到条件为假。如果使用true作为循环条件能够产生无限循环。

while 命令表达式
do
  命令列表
done
#!/bin/bash
#批量添加20个系统账户用户名依次为user1~20
i=1
while [ $i -le 20 ];do
    useradd user$1
    echo "123456" | passwd --stdin user$i &> /dev/null
    i=`expr $i + 1`
done

只要特定条件为真,”while” 语句就会循环执行。

case多重分支语句

根据变量的不通取值,分别执行不同的命令操作。

case 变量值 in
 模式1)
 命令序列1
;;
 模式2)
 命令序列2
;;
 ……
*)
 默认执行的命令序列
;;
esac
#!/bin/bash
case $1 in
start)
  echo "start [mysql](http://man.linuxde.net/mysql "mysql命令")"
;;
stop)
  echo "stop mysql"
;;
*)
  echo "usage: $0 start|stop"
;;
esac

until循环语句

根据条件执行重复操作,直到条件成立为止。只要特定条件为假,它们就重复循环,直到条件为真。

until 条件测试命令
do
 命令序列
done
#!/bin/bash
#
num=1
until [ $num -gt 10 ];do
    echo $num
    num=$(( $num + 1))
done

break控制语句

break语句:在for、while、until等循环语句中,用于跳出当前所在的循环体,执行循环体之后的语句。

# cat break.sh
#!/bin/bash
#
num=1
until [ $num -gt 10 ];do
    echo $num
    if [ $num -gt 5 ];then break ;fi  //当num>5时,跳出整个循环
    num=$(( $num + 1))
done
# bash break.sh
1
2
3
4
5
6

continue控制语句

continue语句:在for、while、until等循环语句中,用于跳过循环体内余下的语句,重新判断条件以便执行下一次循环。

while<-------+
 do          |
             |
commands     | 跳回当前循环,重新开始下一次循环(通常在循环体中与条件语句一起使用)
commands     |
             |
 continue----+

commands
commands
commands
 done
commands
commands

你可能感兴趣的:(5.条件测试操作与流程控制语句)