3.2if条件语句

         到目前为止if语句行都是普通的shell命令。bash的if-then语句没有能力评估任何条件。test命令提供一种检测if-then语句中不同条件的方法。如果test命令中列出的条件评估值为true,test命令以0退出状态代码退出,这使if-then语句使用与其他编程语言中的if-then语句一样的方法运行。test命令的格式非常简单:testcondition

         condition是一系列test命令评估的参数和值。在if-then语句中使用时,test命令格式如下所示:

          第3章 shell结构化命令------------(shell的数值比较、shell的字符串比较、shell的文件比较、shell的条件组合操作)_shell中文件比较

         bash shell提供一种在if-then语句中申明test命令的另一种方法:

         第3章 shell结构化命令------------(shell的数值比较、shell的字符串比较、shell的文件比较、shell的条件组合操作)_shell中字符串值比较_02

         方括号定义在test命令中使用的条件。注意,在前半个方括号的后面和后半个括号的前面必须都有一个空格,否则会得到错误信息。test命令能够评估以下3类条件数值比较、字符串比较、文件比较

3.2.1 数值比较

         使用test命令的最常用方法是比较两个数值。用于测试两个值的条件参数列表:

         第3章 shell结构化命令------------(shell的数值比较、shell的字符串比较、shell的文件比较、shell的条件组合操作)_shell中文件比较_03

         数据测试调教能用于估计数字和变量。test命令无法处理存储在变量中的浮点值。bash shell只能处理整数数字。使用bash计算器时,只能欺骗shell把浮点值作为字符串值存储于一个变量。如果只是想使用echo语句显示结果,这种方法很好用。但是这在面向数值的函数中不起作用。底线是不能在test命令中使用整数。

         数值比较实例如下所示:      


#!/bin/bash
#if的test命令用来数值比较
num1=10
num2=$[10*50]
if [ $num1 -eq 10 ];then
echo "num1 is $num1"
fi
if [ $num1 -gt 9 ]; then
Demo1
fi
if [ $[$num2/100] -ge 5 ];then
echo $[$num2/100]
fi

if [ $num1 -le 10 ];then
echo "num1 is $num1"
fi
if [ $num1 -lt 11 ]; then
Demo1
fi
if [ $[$num2/100] -ne 6 ];then
echo $[$num2/100]
fi

第3章 shell结构化命令------------(shell的数值比较、shell的字符串比较、shell的文件比较、shell的条件组合操作)_字符串_04 


3.2.2字符串比较

         test命令允许对字符串进行比较。执行字符串的比较可能会很复杂,字符串值的比较函数如下所示:   

第3章 shell结构化命令------------(shell的数值比较、shell的字符串比较、shell的文件比较、shell的条件组合操作)_字符串_05

         比较字符串是否相等时,测试比较将所有标点符号和大写都考虑在内。尝试比较一个字符串比另一个字符串是大还是小,使用test命令的大于或者小于功能时,shell通常会遇到两个问题:

²  大于和小于符号一定要转义,否则shell会将它们当作重定向符号,将字符串值看作文件名。

²  大于和小于顺序与在sort命令中的顺序不同。

         第一条能导致很大的错误,而且编写脚本时通常不会发现该问题。在脚本中只单独使用大于号,脚本将大于号理解为输出重定向。由于重定向成功完成,所有测试命令返回退出状态码为0,if语句认为事情已完成。

         第二条更加微妙一点,除非使用大写字母和小写字母,否则不会遇到这种问题。sort命令处理大些字母的方法与test命令处理大写字母的方法相反。在test命令中,大写字母小于小写字母。然而,当在文件中放置相同的字符串并使用sort命令时,首先显示小写字母。由于每条命令使用的排序技术不同。test命令使用标准的ASCII排序,使用每个字母的ACSII数值来决定排列顺序。sort命令使用为系统当前语言设置定义的排列顺序。对于英语来说,当前设置指定小写字母排列顺序在大写字母之前。

         评估一个变量是否包含数据时,使用-n和-z比较方便。空变量和没有初始化的变量可能会对shell脚本测试灾难性的影响。如果不确定变量的内容,在数值比较或者字符串比较中使用它之前,最好使用-n或者-z测试下是否有值。

         字符串比较实例如下所示:     


#!/bin/bash
#字符串比较
str1=testing
str2=Testing
str3=usefull
str4=''

if [ $str1 = $str1 ];then
echo $str1
fi

if [ $str1 != $str2 ];then
echo $str2
fi

#字符串比较大小时,要进行转义
#不然系统把大于和小于当作重定向操作
if [ $str2 \< $str1 ];then
echo '$str2 is litter than $str1'
fi

if [ $str3 \> $str1 ];then
echo '$str3 is greater than $str1'
fi

if [ -n $str3 ];then
echo $str3
fi

if [ -2 $str4 ];then
echo '\$str4 is null '
fi

第3章 shell结构化命令------------(shell的数值比较、shell的字符串比较、shell的文件比较、shell的条件组合操作)_shell中复合条件与 或_06


3.2.3 文件比较

         test命令能够测试Linux文件系统上的文件和路径,比较参数如下所示:

         第3章 shell结构化命令------------(shell的数值比较、shell的字符串比较、shell的文件比较、shell的条件组合操作)_shell中字符串值比较_07

         -d测试检查指定的文件是否作为目录存在与系统中。如果将文件写到一个目录下,或者试图改变到目录位置之前,这通常是一个很好的操作。

         -e检查文件或目录是否存在。要确定指定的对象是一个文件,必须使用-f文件。在尝试从文件中读取数据之前,通常首先使用-r检查文件是否能读取。

         文件比较实例如下:       


#!/bin/bash
#文件比较实例
folder=$PWD/Test
file1=$folder/test1
file2=$folder/test2
#是否存在Test目录,如果不存在,创建该目录
if [ -d $folder ];then
echo "$folder does not exists!"
else
echo "创建目录!"
mkdir $folder
if [ -e $folder ];then
echo "进入到$folder"
cd $folder
echo $PWD
if [ -e $file1 ];then
echo "test1文件不存在!"
else
touch $file1
if [ -f $file1 ];then
if [ -r $file1 ];then
echo "test1文件没有读权限!"
fi
chmod u+rwx $file1
if [ -s $file1 ];then
date;who>>$file1
cat -n $file1
else
../Demo1>$file1
cat -n $file1
fi
fi
fi
fi
fi
touch $file2
if [ $file2 -nt $file1 ];then
echo "test2比test1新!"
fi

第3章 shell结构化命令------------(shell的数值比较、shell的字符串比较、shell的文件比较、shell的条件组合操作)_shell中数值比较_08

3.2.4 复合条件检查

         if-then语句可以使用布尔逻辑合并来检查。可以使用两个布尔操作符:

         第3章 shell结构化命令------------(shell的数值比较、shell的字符串比较、shell的文件比较、shell的条件组合操作)_shell中数值比较_09

         第一个布尔操作使用AND布尔操作符来合并两个条件,两个条件必须都满足才能执行then部分。

         第二个布尔操作使用OR布尔操作符来合并两个条件。如果任意一个条件评估为true,才能执行then部分。

         复合条件检查操作实例如下所示:         


#!/bin/bash
#复合条件检查实例
num1=20
num3=''
if [ $num1 -ge 20 ] && [ -z $num3 ];then
echo "num1 is $num1,num3 is null"
fi

if [ $num1 -lt 18 ] || [ -z $num3 ];then
echo "$num1 is less than 18,num3 is null"
fi

第3章 shell结构化命令------------(shell的数值比较、shell的字符串比较、shell的文件比较、shell的条件组合操作)_shell中数值比较_10