shell脚本中的逻辑判断,文件目录属性判断,if特殊用法,case判断

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

猜你喜欢

转载自blog.51cto.com/13067688/2122241