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