20.5 Shell脚本中的逻辑判断
在shell脚本当中很多地方都会用到逻辑判断,判断某一个数值,判断某个目录或文件,然后针对判断的结果再做一个操作,若没有判断,是无法进行一些操作的.
例如cp一些文件,或者MV,或是删除某个文件,没有判断,写这些命令就没什么意义,也就不叫作shell脚本,可见shell脚本非常重要.
shell当中常见的逻辑判断语法
格式1:if条件;then 语句;if
格式2:if条件;then 语句;else 语句;if
格式3:if ....; then ....;elif...; then...; else...; fi
-lt (小于)
-gt (大于)
-le (小于或等于)
-ge(大于或等于)
-eq(等于)
-ne(不等于)
&& 表示并且
|| 表示或者
#在命令行里也可以实现,不一定要写shell脚本才可以实现,只不过使用命令去实现需要使用分号.
[root@quandong ~]# for i in `seq 1 5`; do echo $i; done
1
2
3
4
5
#不使用分号将会是这样的
[root@quandong ~]# for i in `seq 1 5`
> do
> echo $i
> done
1
2
3
4
5
格式1:if条件;then 语句;if
在命令行操作
[root@quandong ~]# a=6
[root@quandong ~]# if [ $a -gt 3 ]; then echo ok; fi
ok
说明:方括号两边需要有空格,-gt 是大于, $a大于3,那么这肯定OK的.
在脚本里写,就整理一下格式即可,然后再执行
[root@quandong sbin]# cat 04.sh
#! /bin/bash
a=6
if [ $a -gt 3 ]
then
echo ok
fi
[root@quandong sbin]# sh 04.sh
ok
格式2:if条件;then 语句;else 语句;if
[root@quandong sbin]# vim 05.sh
#! /bin/bash
a=2
if [ $a -gt 3 ]
then
echo ok
else
echo nook
fi
[root@quandong sbin]# sh -x 05.sh
+ a=2
+ '[' 2 -gt 3 ']'
+ echo nook
nook
#如果$a 大于3,输出OK, 否则(else),输出nook
格式3:if ....; then ....;elif...; then...; else...; fi
# 满足一个条件的情况
[root@quandong sbin]# vim 06.sh
#! /bin/bash
a=6
if [ $a -gt 3 ]
then
echo ">3"
elif [ $a -lt 8 ]
echo "<8 && >3"
else
echo nook
fi
#执行过程
[root@quandong sbin]# sh -x 06.sh
+ a=6
+ '[' 6 -gt 3 ']'
+ echo '>3'
>3
说明:如果$a 大于3,输出>3 ;又如果(elif)$a 小于8,输出<8 && >3
那满足了第一个条件,$a 大于3,输出>3,后面的条件就不再执行了.
elif 是可以使用多次的;
lt 是小于
#所有条件都不满足的情况
[root@quandong sbin]# vim 06.sh
#! /bin/bash
a=6
if [ $a -gt 7 ]
then
echo ">7"
elif [ $a -lt 5 ]
then
echo "<5 && >7"
else
echo "nook"
fi
执行过程
[root@quandong sbin]# sh -x 06.sh
+ a=6
+ '[' 6 -gt 7 ']'
+ '[' 6 -lt 5 ']'
+ echo nook
nook
说明:如果$a 大于7,输出>7,不满足,执行下一个条件,又如果$a 小于5,输出<5 && >7,都不满足,输出nook
20.6 文件目录属性判断
[ -f file ] 判断是否是普通文件,且存在
[ -d file ] 判断是否是目录,且存在
[ -e file ] 判断文件或者目录是否存在
[ -r file ] 判断文件是否可读
[ -w file ] 判断文件是否可写
[ -x file ] 判断文件是否可执行
[ -f file ] 判断是否是普通文件,且存在
# 判断文件是否存在,若不存就创建
[root@quandong sbin]# vim file1.sh
#! /bin/bash
f="/tmp/Annalinux"
if [ -f $f ]
then
echo $f exist
else
touch $f
fi
#执行过程
[root@quandong sbin]# sh -x file1.sh
+ f=/tmp/Annalinux
+ '[' -f /tmp/Annalinux ']'
+ touch /tmp/Annalinux
说明:if [ -f $f ] 判断/tmp/Annalinux 是否存在,明显是不存在的,所有就touch 了这个文件
# 重新执行一次,判断文件是否存在,若存就输出结果
[root@quandong sbin]# sh -x file1.sh
+ f=/tmp/Annalinux
+ '[' -f /tmp/Annalinux ']'
+ echo /tmp/Annalinux exist
/tmp/Annalinux exist
说明:前面不存在就touch了, 重新再执行一次肯定是存在的这个文件,那么判断输出是存在
[ -d file ] 判断是否是目录,且存在
# 判断目录是否存在,若不存在就创建
[root@quandong sbin]# cat file2.sh
#! /bin/bash
d="/tmp/Anna"
if [ -d $d ]
then
echo $d exist
else
mkdir $d
fi
#执行过程
[root@quandong sbin]# sh -x file2.sh
+ d=/tmp/Anna
+ '[' -d /tmp/Anna ']'
+ mkdir /tmp/Anna
说明:if [ -d $d ] 判断/tmp/Annalinux 是否存在,明显是不存在的,所有就mkdir 了这个文件
#重新执行一次,判断目录是否存在,若存在就输出
[root@quandong sbin]# sh -x file2.sh
+ d=/tmp/Anna
+ '[' -d /tmp/Anna ']'
+ echo /tmp/Anna exist
/tmp/Anna exist
说明:前面不存在就mkdir了, 重新再执行一次肯定是存在的这个文件,那么判断输出是存在
[ -e file ] 判断文件或者目录是否存在
[root@quandong sbin]# cat file2.sh
#! /bin/bash
f="/tmp/Anna"
if [ -e $f ]
then
echo $f exist
else
mkdir $f
fi
#执行过程
[root@quandong sbin]# sh -x file2.sh
+ f=/tmp/Anna
+ '[' -e /tmp/Anna ']'
+ echo /tmp/Anna exist
/tmp/Anna exist
说明:-e 不管是文件或目录,是判断是否存在,不存在的话就touch
[ -r file ] 判断文件是否可读
[root@quandong sbin]# vim file2.sh
#! /bin/bash
f="/tmp/Anna"
if [ -r $f ]
then
echo $f readable
fi
#执行
[root@quandong sbin]# sh file2.sh
/tmp/Anna readable
[ -w file ] 判断文件是否可写
[root@quandong sbin]# vim file2.sh
#! /bin/bash
f="/tmp/Anna"
if [ -r $f ]
then
echo $f readable
fi
#执行
[root@quandong sbin]# sh file2.sh
/tmp/Anna writeable
说明:可写是针对当前root用户,若切换到quandong用户,那么就只有可读的权限,没有可读权限
[ -x file ] 判断文件是否可执行
[root@quandong sbin]# vim file2.sh
#! /bin/bash
f="/tmp/Anna"
if [ -x $f ]
then
echo $f exeable
fi
#执行
[root@quandong sbin]# sh file2.sh
/tmp/Anna exeable
说明:可写是针对当前root用户,若切换到quandong用户,那么就只有可读的权限,没有可执行权限
判断一个目录是否存在,如果存在删除掉
[root@quandong sbin]# vim file2.sh
#! /bin/bash
d="/tmp/Anna"
if [ -d $d ]
then
rmdir $d
fi
#执行
[root@quandong sbin]# sh -x file2.sh
+ d=/tmp/Anna
+ '[' -d /tmp/Anna ']'
+ rmdir /tmp/Anna
#判断一个目录是否存在,如果存在就输出This is ok, 若不存在就创建
[root@quandong sbin]# vim file2.sh
#! /bin/bash
d="/tmp/Anna"
if [ -d $d ]
then
echo "This is ok"
else [ -d $d ]
mkdir $d
fi
#执行
[root@quandong sbin]# sh -x file2.sh
+ d=/tmp/Anna
+ '[' -d /tmp/Anna ']'
+ echo 'This is ok'
This is ok
20.7 if特殊用法
if [ -z "$a" ] 表示当变量a 的值为空时会怎么样
if [ -n "$a" ] 表示当变量a的值不为空
if grep -q '123' 1.txt; then 表示如果1.txt中含有‘123’的行时会怎样
if [ ! -e file ]; then ... 表示文件不存在时会怎样
if (($a<1)); then .. 等同于 if [ $a -lt 1 ]; then...
[ ] 中不能使用 <,>, ==, !=,>=,<=这样的符号
if [ -n "$a" ] 表示当变量a的值不为空
if [ -z "$a" ] 表示当变量a 的值为空
if [ -n "$a" ] 表示当变量a的值不为空
[root@quandong sbin]# if [ -n 09.sh ]; then echo ok; else echo "09.sh is null"; fi
ok
说明: 判断01.sh 是否为空,不为空 ,输出is ok
# if [ -z "$a" ] 表示当变量a 的值为空
[root@quandong sbin]# if [ -z "$b" ]; then echo no null; fi
no null
说明:
if [ ! -e file ]; then ... 表示文件不存在时会怎样
[root@quandong sbin]# vim file3.sh
#! /bin/bash
if [ ! -f /tmp/Annalinux ]
then
echo "No such file or directory"
exit
fi
if [ -f /tmp/Annalinux ]
then
echo "This is file"
exit
fi
[root@quandong sbin]# sh -x file3.sh
+ '[' '!' -f /tmp/Annalinux ']'
+ '[' -f /tmp/Annalinux ']'
+ echo 'This is file'
This is file
+ exit
说明: 先判断/tmp/Annalinux 文件是否存在,如果不存在,输出 No such file or directory。并退出
如果存在,输出This is file,并退出.
! -F 表示不存在
-f 表示存在
! -f 和 -f 意思相反
在逻辑判断中,还可以根据判断结果,作为判断结果
[root@quandong sbin]# if grep -w 'apache' /etc/passwd; then echo "apache exist"; fi
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
apache exist
[root@quandong sbin]# if grep -wq 'apache' /etc/passwd; then echo "apache exist"; fi
apache exist
说明: 如果apache这个单词在/etc/passwd 这个文件存在,输出apache exist
grep -w 选项表示匹配一个单词, -q不显示任何信息
[root@quandong sbin]# if ! grep -w 'user1' /etc/passwd; then echo useradd user1; fi
useradd user1
说明: if ! grep -w 'user1' 取反的意思,如果user1这个用户不存在,那么创建user1用户.
20.8 /20.9 cace判断
case 逻辑判断
说明:这个脚本的目的是让用户输入一个数字,然后用这个脚本去判断用户输入的数字的一个范围
[root@quandong sbin]# vim case.sh
#! /bin/bash
read -p " Please input a number: "n
if [ -z "$n" ] //判断 $n是否为空, 为空的话,说明用户没有输入数字
then
echo "Please input a number." //那么就提示请输入数字
exit 1 //然后退出来,返回一个数值 1
fi
n1=`echo $n |sed 's/[-0-9]//g'` //判断输入的是否是纯数字,echo 出来后,做一个特殊操作,使用sed 把所有
的数字 0-9 清空, $n1 这个变量就为空了
if [ ! -z $n1 ] // 当变量不为空时,说明输入的不是数字,不合法,则提示继续输入数字
当变量为空时继续往下执行,说明输入的是数字
then
echo "Please input a number." //继续提示输入数字
exit 1 //继续退出来,返回一个数值 1
#elif [ $n -lt 0 ] || [ $n -gt 100 ]
#then
# echo "Then number range is 0-100."
# exit 1
fi
if [ $n -lt 60 ]
then
tag=1
elif [ $n -ge 60 ] && [ $n -lt 80 ]
then
tag=2
elif [ $n -ge 80 ] && [ $n -lt 90 ]
then
tag=3
elif [ $n -ge 90 ] && [ $n -le 100 ]
then
tag=4
else
tag=0
fi
case $tag in
1)
echo " 不及格"
;;
2)
echo "及格"
;;
3)
echo "良好"
;;
4)
echo "优秀"
;;
*)
echo "The number range is 0-100."
;;
esac
# read -p " Please input a number: "n
说明 n 作为捕获一个变量的名字,用户输入什么数字,那么这个n 就会赋值什么数字,这就是read -p 的作用
演示:
[root@quandong sbin]# read -p " Please input a number: " n
Please input a number: 100
[root@quandong sbin]# echo $n
100
[root@quandong sbin]# read -p " Please input a number: " n
Please input a number: 800
[root@quandong sbin]# echo $n
800
#执行,输入数字90
[root@quandong sbin]# sh -x case.sh
+ read -p ' Please input a number: ' n
Please input a number: 90
+ '[' -z 90 ']' //判断 90 变量是否存在
++ sed 's/[-0-9]//g' // $n1 清空
++ echo 90
+ n1= //$n1 为空
+ '[' '!' -z ']' // 判断是否不为空,不为空说明正常,往下匹配
+ '[' 90 -lt 60 ']'
+ '[' 90 -ge 60 ']'
+ '[' 90 -lt 80 ']'
+ '[' 90 -ge 80 ']'
+ '[' 90 -lt 90 ']'
+ '[' 90 -ge 90 ']'
+ '[' 90 -le 100 ']'
+ tag=4 //匹配到了第4个条件
+ case $tag in
+ echo $'\344\274\230\347\247\200'
优秀
# 执行,输入非数字,就会提示请输入数字
[root@quandong sbin]# sh -x case.sh
+ read -p ' Please input a number: ' n
Please input a number: gsagas
+ '[' -z gsagas ']' //判断 gsagas 变量是否存在
++ sed 's/[-0-9]//g' //清空$n1 所有数字
++ echo gsagas
+ n1=gsagas //$n1不为空,所以输入的不是数字有问题
+ '[' '!' -z gsagas ']'
+ echo 'Please input a number.'
Please input a number. //提示请输入数字
+ exit 1