1.shell脚本的逻辑判断
在shell脚本中,-gt (>); -lt(=); -le(<=);-eq(==); -ne(!=),&&(与),||(或)。
或者用(($a>1))这种方式来表示;
[root@yuioplvlinux-128 ~]# a=5
[root@yuioplvlinux-128 ~]# if [ $a -gt 3 ];then echo "OK"; fi
OK
格式1:if 条件 ; then 语句; fi
[root@yuioplvlinux-128 ~]# cd /usr/local/sbin/
[root@yuioplvlinux-128 sbin]# vim if1.sh
#! /bin/bash
a=5
if [ $a -gt 3 ]
then
echo "OK"
fi
[root@yuioplvlinux-128 sbin]# sh if1.sh
OK
格式2:if 条件; then 语句; else 语句; fi
[root@yuioplvlinux-128 sbin]# vim if2.sh
#! /bin/bash
a=1
if [ $a -gt 3 ]
then
echo "OK"
else
echo "error"
fi
[root@yuioplvlinux-128 sbin]# sh -x if2.sh
+ a=1
+ '[' 1 -gt 3 ']'
+ echo error
error
格式3:if …; then … ;elif …; then …; else …; fi
[root@yuioplvlinux-128 sbin]# vim if3.sh
#! /bin/bash
a=5
if [ $a -gt 8 ]
then
echo ">8"
elif [ $a -gt 3 ]
then
echo ">3"
else
echo "<3"
fi
[root@yuioplvlinux-128 sbin]# sh -x if3.sh
+ a=5
+ '[' 5 -gt 8 ']'
+ '[' 5 -gt 3 ']'
+ echo '>3'
>3
2.文件目录属性判断
shell脚本中if还经常用于判断文件的属性,比如判断是普通文件还是目录,判断文件是否存在,判断文件是否有读、写、执行的权限等。常用的选项有:
-e:判断文件或目录是否存在;
-d:判断是否为目录以及是否存在;
-f:判断是否为普通文件以及是否存在;
-r:判断是否有读权限;
-w:判断是否有写权限;
-x:判断是否有执行权限;
[root@yuioplvlinux-128 ~]# if [ -e /home/ ]; then echo ok; fi
ok
[root@yuioplvlinux-128 ~]# if [ -d /home/ ]; then echo ok; fi
ok
[root@yuioplvlinux-128 ~]# if [ -f /root/123.txt ]; then echo ok; fi
ok
文件的读、写、执行权限是指登录用户的权限,比如123.txt文档,root对其有读写权限,而没有执行权限;
[root@yuioplvlinux-128 ~]# ll /root/123.txt
-rw-r--r-- 1 root root 1379 7月 11 22:00 /root/123.txt
[root@yuioplvlinux-128 ~]# if [ -r /root/123.txt ]; then echo ok; fi
ok
[root@yuioplvlinux-128 ~]# if [ -w /root/123.txt ]; then echo ok; fi
ok
[root@yuioplvlinux-128 ~]# if [ -x /root/123.txt ]; then echo ok; fi
还有一种用法,如下:
#! /bin/bash
a="/tmp/yuioplv"
[ -f $a ] && rm -f $a #判断/tmp/yuioplv文件是否存在,存在则删除该文件
等同于
if [ -f $a ]
then
rm -f $a
fi
执行该脚本,删除了/tmp/yuioplv文件;
[root@yuioplvlinux-128 sbin]# sh -x test.sh
+ a=/tmp/yuioplv
+ '[' -f /tmp/yuioplv ']'
+ rm -f /tmp/yuioplv
类似的有:
#! /bin/bash
a="/tmp/yuioplv"
[ -f $a ] || touch $a #判断/tmp/yuioplv文件是否存在,不存在则创建该文件
等同于
if [ -f $a ]
then
else
touch $a
fi
执行该脚本,创建了/tmp/yuioplv文件。
[root@yuioplvlinux-128 sbin]# sh -x test.sh
+ a=/tmp/yuioplv
+ '[' -f /tmp/yuioplv ']'
+ touch /tmp/yuioplv
[root@yuioplvlinux-128 sbin]# ll /tmp/yuioplv
-rw-r--r-- 1 root root 0 7月 12 21:39 /tmp/yuioplv
if的特殊用法
1)if [ -z "$a" ] 这个表示当变量a的值为空;
[root@yuioplvlinux-128 sbin]# vim if4.sh
#!/bin/bash
if [ ! -f /tmp/op ]
then
echo "/tmp/op not exist."
exit
fi
n=`wc -l /tmp/op`
if [ -z "$a" ]
then
echo error
exit
elif [ $n -gt 120 ]
then
echo ok
fi
[root@yuioplvlinux-128 sbin]# sh -x if4.sh
+ '[' '!' -f /tmp/op ']'
+ echo '/tmp/op not exist.'
/tmp/op not exist.
+ exit
2)if [ -n "$a" ] 表示当变量a的值不为空;
[root@yuioplvlinux-128 sbin]# echo $b
[root@yuioplvlinux-128 sbin]# if [ -n "$b" ]; then echo $b; else echo "b is not null"; fi
b is not null
3)if grep -q判断一个文件是否包含某一行;
[root@yuioplvlinux-128 sbin]# if grep -wq 'yu' /etc/passwd; then echo "yu exist"; fi #/etc/passwd中是否存在yu,然后输出yu存在
yu exist
[root@yuioplvlinux-128 sbin]# if ! grep -wq 'user1' /etc/passwd; then useradd user1; fi #/etc/passwd中是否存在user1,不存在就创建该用户
[root@yuioplvlinux-128 sbin]# cat /etc/passwd |grep user1
user1:x:1126:1126::/home/user1:/bin/bash
3.case判断
在shell脚本中,除了用if来判断逻辑,还有一种另外的方式——case,其格式如下:
格式 case 变量名 in
value1)
command;
;;
value2)
command;
;;
value3)
command;
;;
*)
command;
;;
esac
在上面的结构中,不限制value的个数,*代表其他值。
下面是一个shell脚本,用来判断成绩的优劣;
[root@yuioplvlinux-128 sbin]# vim case1.sh
#!/bin/bash
read -p "Please input a number: " n #提示输入字母,并将输入的值赋值给n
if [ -z "$n" ] #判断为空
then
echo "Please input a number."
exit 1
fi
n1=`echo $n|sed 's/[0-9]//g'` #清空n变量的数字
if [ -n "$n1" ] #判断不为空
then
echo "Please input a number."
exit 1
fi
if [ $n -lt 60 ] && [ $n -ge 0 ] #大于等于0小于60
then
tag=1
elif [ $n -ge 60 ] && [ $n -lt 80 ] #大于等于60小于80
then
tag=2
elif [ $n -ge 80 ] && [ $n -lt 90 ] #大于等于80小于90
then
tag=3
elif [ $n -ge 90 ] && [ $n -le 100 ] #大于等于90小于100
then
tag=4
else
tag=0
fi
case $tag in
1)
echo "not ok"
;;
2)
echo "ok"
;;
3)
echo "good"
;;
4)
echo "prefect"
;;
*)
echo "The number range is 0-100."
;;
esac
下面是执行过程:
[root@yuioplvlinux-128 sbin]# sh -x case1.sh
+ read -p 'Please input a number: ' n
Please input a number: 101
+ '[' -z 101 ']'
++ echo 101
++ sed 's/[0-9]//g'
+ n1=
+ '[' -n '' ']'
+ '[' 101 -lt 60 ']'
+ '[' 101 -ge 60 ']'
+ '[' 101 -lt 80 ']'
+ '[' 101 -ge 80 ']'
+ '[' 101 -lt 90 ']'
+ '[' 101 -ge 90 ']'
+ '[' 101 -le 100 ']'
+ tag=0
+ case $tag in
+ echo 'The number range is 0-100.'
The number range is 0-100.
[root@yuioplvlinux-128 sbin]# sh case1.sh
Please input a number: 0
not ok
[root@yuioplvlinux-128 sbin]# sh case1.sh
Please input a number: 60
ok
[root@yuioplvlinux-128 sbin]# sh case1.sh
Please input a number: 82
good
[root@yuioplvlinux-128 sbin]# sh case1.sh
Please input a number: 99
prefect