shell中的逻辑判断
格式1:if 条件 ; then 语句; fi if是如果怎么样,then是则怎么样 写一个简单的脚本,它的意思是当a=5,当a大于3时打印ok #!/bin/bash a=5 if [ $a -gt 3 ] then echo ok fi 保存退出后执行脚本 [root@linletao-001 shell]# sh if1.sh ok 其中gt的在shell中的意义是大于的意思。这里需要注意的是中括号中的空格,在两边和中间的都有空格。
格式2:if 条件; then 语句; else 语句; fi 它的意思是如果满足怎么样,如果不满足会怎么样。 #!/bin/bash a=1 if [ $a -gt 3 ] then echo ok else echo nook fi 保存后退出执行脚本 [root@linletao-001 shell]# sh if2.sh nook 这里面就是条件没有大于3,不满足条件,所以就打印了nook。
格式3:if …; then … ;elif …; then …; else …; fi 在满足条件的基础上又进行比较。elif是又加了一个逻辑判断,他后面接done,这个可以写很多个。 #!/bin/bash a=3 if [ $a -gt 4 ] then echo ">1" elif [ $a -gt 6 ] then echo "<6 && >1"
else echo nook fi 保存后退出,并执行。 [root@linletao-001 shell]# sh -x if3.sh
- a=3
- '[' 3 -gt 4 ']'
- '[' 3 -gt 6 ']'
- echo nook nook 可以看出,他执行了两次逻辑判断。
逻辑判断表达式:if [ $a -gt $b ]; if [ $a -lt 5 ]; if [ $b -eq 10 ]等 -gt (大于>); -lt(小于<); -ge(大于等于>=); -le(小于等于<=); -eq(等于=); -ne(不等于!=) 注意到处都是空格
如果想用符号去写脚本的话,则要用两个(())去括起来条件,这样就可以用符号了。 例如: #!/bin/bash a=5 if (($a>3)) then echo ok fi
可以使用 && || 结合多个条件 &&表示并且 ||表示或者 if [ $a -gt 5 ] && [ $a -lt 10 ]; then if [ $b -gt 5 ] || [ $b -lt 3 ]; then
文件目录属性判断
[ -f file ]判断是否是普通文件,且存在。 #!/bin/bash f="/tmp/linletao" if [ -f $F ] then echo $f exist else touch $f fi 这个脚本的意思是,判断/tmp/linletao是否存在,如果存在,则打印f的路径,如果不存在,则创建文件。 [root@linletao-001 ~]# sh -x file1.sh
- f=/tmp/llt
- '[' -f /tmp/llt ']'
- touch /tmp/llt(没有文件,然后创建文件)
[root@linletao-001 ~]# sh -x file1.sh
- f=/tmp/llt
- '[' -f /tmp/llt ']'
- echo /tmp/llt exist /tmp/llt exist(文件存在,打印文件路径)
[ -d file ] 判断是否是目录,且存在 [root@linletao-001 ~]# sh -x file2.sh
- f=/tmp/llt
- '[' -d /tmp/llt ']'
- touch /tmp/llt(没有文件,然后创建文件) 这个脚本的意思是判断文件是否是一个目录,如果没有则创建。
[ -e file ] 判断文件或目录是否存在 #!/bin/bash f="/tmp/llt" if [ -e $f ] then echo ok else touch $f fi 这个脚本的意思是判断/tmp/llt是否存在,如果存在打印ok,如果不存在,则创建文件。 [root@linletao-001 ~]# sh -x file2.sh
- f=/tmp/llt
- '[' -e /tmp/llt ']'
- echo ok ok(文件存在)
[ -r file ] 判断文件是否可读 #!/bin/bash f="/tmp/llt" if [ -r $f ] then echo $f readable fi 这个脚本的意思是查看问价是否可读。 [root@linletao-001 ~]# sh -x file2.sh
- f=/tmp/llt
- '[' -r /tmp/llt ']'
- echo /tmp/llt readable(文件可读)
[ -w file ] 判断文件是否可写 [root@linletao-001 ~]# sh -x file2.sh
- f=/tmp/llt
- '[' -w /tmp/llt ']'
- echo /tmp/llt writeable /tmp/llt writeable(文件可写)
[ -x file ] 判断文件是否可执行 #!/bin/bash f="/tmp/llt" if [ -x $f ] then echo $f exeable else echo nook fi 这个脚本的意思是,是否可执行,如果不可执行,则打印nook
if特殊用法
if [ -z "$a" ] 这个表示当变量a的值为空(变量需要用“”引起来,文件则不用)
例如:
#!/bin/bash
n=wc -l /tmp/lalala
(需要注意的是,这里我们要用反引号引起来)
if [ -z "$n" ]
then
echo error
exit
elif [ $n -gt 100 ]
then
echo ok
fi
这个脚本的意思是,如果$n为空,那么会打印出error,然后退出。如果不为空,切大于100行,则打印ok
[root@linletao-001 shell]# sh -x if4.sh
++ wc -l /tmp/lalala
wc: /tmp/lalala: 没有那个文件或目录
- n=
- '[' -z '' ']'
- echo error error
- exit 运行结果是$n为空,所以打印error,然后退出。
if [ -n "$a" ] 表示当变量a的值不为空 [root@linletao-001 shell]# if [ -n 1.sh ]; then echo ok ; fi ok 它的意思是当1.sh不为空时,打印ok
在逻辑判断中,我们也可以使用一个命令的结果作为判断条件,比如判断某一个文件中是否含有某些字符串。 例如: if grep -wq 'user' /etc/passwd; then echo ok; fi ok 这个脚本的意思是没如果这个文件中好友user这个字符串,就打印ok。结果是这个文件含有user这个字符串,所以打印ok if [ ! -e file ]; then 表示文件不存在时会怎么样,其中!为取反的意思。
if (($a<1)); then …等同于 if [ $a -lt 1 ]; then… [ ] 中不能使用<,>,==,!=,>=,<=这样的符号
case判断
格式 case 变量名 in
value1)
command
;;
value2)
command
;;
*)
commond
;;
他表示,如果变量在valux1时,执行下面的命令,在value2时执行下面的命令,以此类推。其中;;表示一个判断结束,进入下一个判断。
esac在case程序中,可以在条件中使用|,表示或的意思,
比如:
2|3)
command
;;
我们写一个脚本,case.sh
#!/bin/bash
read -p "Please input a number: " n
if [ -z "$n" ]
then
echo "Please input a number."
exit 1
fi
n1=echo $n|sed 's/[0-9]//g'
if [ -n "$n1" ]
then
echo "Please input a number."
exit 1
fi
if [ $n -lt 60 ] && [ $n -ge 0 ]
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
read -p命令,你问用户做什么,用户输入什么,最后把用户的输入捕获,作为判断条件。 例如: [root@linletao-001 ~]# read -p "please input a number: " n please input a number: 8 [root@linletao-001 ~]# echo $n 8 其中,n作为你补货变量的一个名字。用户输入什么,最终这个变量就会赋值什么。 然后我们执行这个脚本
[root@linletao-001 shell]# sh case.sh Please input a number: 30 not ok
[root@linletao-001 shell]# sh case.sh Please input a number: 60 ok
[root@linletao-001 shell]# sh case.sh Please input a number: 80 ook
[root@linletao-001 shell]# sh case.sh Please input a number: 100 oook
[root@linletao-001 shell]# sh case.sh Please input a number: 101 The number range is 0-100.
以上五种情况全部都有结果,表示脚本成功。
执行过程,我们以80为例 [root@linletao-001 shell]# sh -x case.sh
- read -p 'Please input a number: ' n Please input a number: 80
- '[' -z 80 ']' ++ echo 80 ++ sed 's/[0-9]//g'
- n1=
- '[' -n '' ']'
- '[' 80 -lt 60 ']'
- '[' 80 -ge 60 ']'
- '[' 80 -lt 80 ']'
- '[' 80 -ge 80 ']'
- '[' 80 -lt 90 ']'
- tag=3
- case $tag in
- echo ook ook