linux 学习笔记-069-Shell 编程-逻辑判断,属性判断,if 特殊用法,case 判断

发布于 2018-04-18  246 次阅读


Shell 脚本中的逻辑判断

在 Shell 脚本中,到处都是逻辑判断,有了逻辑判断,才能真正的叫 Shell 脚本

格式 1:if 条件 ; then 语句; fi

格式 2:if 条件; then 语句; else 语句; fi

格式 3:if …; then … ;elif …; then …; else …; fi

逻辑判断表达式:

if [ $a -gt $b ]:变量 a 大于变量 b

if [ $a -lt 5 ]:变量 a 小于 5

if [ $b -eq 10 ]:变量 b 等于 10

-gt ---- (>);-lt ---- (<);-ge ---- (>=);-le ---- (<=);-eq ---- (==);-ne ---- (!=)

可以使用 && || 结合多个条件

if [ $a -gt 5 ] && [ $a -lt 10 ]; then

if [ $b -gt 5 ] || [ $b -lt 3 ]; then

&&:表示并且

||:表示或者

01:

当变量 a 大于 3 的时候,输出 ok,切记,shell 脚本对空格有严格要求

[root@am-01:~/shell#] vim 2.sh

#!/bin/bash

a=5

if [ $a -gt 3 ]

then

    echo ok

fi

[root@am-01:~/shell#] sh 2.sh

ok

02:

当变量 a 大于 3 的时候,输出 ok,小于 3 的时候输出 no ok

[root@am-01:~/shell#] vim 3.sh

#!/bin/bash

a=1

if [ $a -gt 3 ]

then

    echo ok

else

    echo no ok

fi

[root@am-01:~/shell#] sh 3.sh

no ok

03:

增加 elif 条件判断,满足第二个变量 a 小于 5 的条件的时候,输出"<5"

[root@am-01:~/shell#] vim 4.sh

#!/bin/bash

a=4

if [ $a -gt 5 ]

then

    echo '>5'

elif [ $a -lt 5 ]

then

    echo '<5'

else

    echo 'no ok'

fi

[root@am-01:~/shell#] sh -x 4.sh

+ a=4

+ '[' 4 -gt 5 ']'

+ '[' 4 -lt 5 ']'

+ echo '<5'

<5

04:

另一种写法,直接使用符号代表大于、小于、等于等,不过一般不建议这样写

[root@am-01:~/shell#] vim 5.sh

#!/bin/bash

a=4

if (($a==3))

then

    echo '=3'

elif (($a>5))

then

    echo '>5'

elif (($a<6))

then

    echo '<6'

else

    echo 'no'

fi

[root@am-01:~/shell#] sh -x 5.sh

+ a=4

+ (( 4==3 ))

+ (( 4>5 ))

+ (( 4<6 ))

+ echo '<6'

<6

文件目录属性判断

[ -f file ]:判断是否是普通文件,且存在

[ -d file ]:判断是否是目录,且存在

[ -e file ]:判断文件或目录是否存在

[ -r file ]:判断文件是否可读,相对于当前用户来讲

[ -w file ]:判断文件是否可写,相对于当前用户来讲

[ -x file ]:判断文件是否可执行,相对于当前用户来讲

01:

判断/tmp/am 文件是否存在,存在就告诉你已存在,不存在就 touch 新建这个文件

[root@am-01:~/shell#] vim 6.sh

#!/bin/bash

f=‘/tmp/am’

if [ -f $f ]

then

    echo $f exist.

else

    touch $f

fi

[root@am-01:~/shell#] sh -x 6.sh

+ f=/tmp/am

+ '[' -f /tmp/am ']'

+ touch /tmp/am

[root@am-01:~/shell#] sh -x 6.sh

+ f=/tmp/am

+ '[' -f /tmp/am ']'

+ echo /tmp/am exist.

/tmp/am exist.

02:

判断/tmp/am01 目录是否存在,存在就告诉你已存在,不存在就 mkdir 新建这个目录

[root@am-01:~/shell#] vim 7.sh

#!/bin/bash

f=‘/tmp/am01’

if [ -d $f ]

then

    echo $f exist.

else

    mkdir $f

fi

[root@am-01:~/shell#] sh -x 7.sh

+ f=/tmp/am01

+ '[' -d /tmp/am01 ']'

+ mkdir /tmp/am01

03:

判断/tmp/am 目录或者文件是否存在,存在就告诉你已存在,不存在就 touch 一下

[root@am-01:~/shell#] vim 8.sh

#!/bin/bash

f=‘/tmp/am’

if [ -e $f ]

then

    echo $f exist.

else

    touch $f

fi

[root@am-01:~/shell#] sh -x 8.sh

+ f=/tmp/am

+ '[' -e /tmp/am ']'

+ echo /tmp/am exist.

/tmp/am exist.

04:

判断/tmp/am 文件是否可读,可读就告诉你可读

[root@am-01:~/shell#] vim 9.sh

#!/bin/bash

f='/tmp/am'

if [ -r $f ]

then

    echo $f readable.

fi

[root@am-01:~/shell#] sh -x 9.sh

+ f=/tmp/am

+ '[' -r /tmp/am ']'

+ echo /tmp/am readable.

/tmp/am readable.

05:

判断/tmp/am 文件是否可写,可写就告诉你可写

[root@am-01:~/shell#] vim 10.sh

#!/bin/bash

f='/tmp/am'

if [ -w $f ]

then

    echo $f writeble.

fi

[root@am-01:~/shell#] sh -x 10.sh

+ f=/tmp/am

+ '[' -w /tmp/am ']'

+ echo /tmp/am writeble.

/tmp/am writeble.

06:

判断/tmp/am 文件是否可执行,可执行就告诉你可执行,不可执行就告诉你不可执行

[root@am-01:~/shell#] vim 11.sh

#!/bin/bash

f='/tmp/am'

if [ -x $f ]

then

    echo $f exeble.

else

    echo $f no exeble.

fi

[root@am-01:~/shell#] sh -x 11.sh

+ f=/tmp/am

+ '[' -x /tmp/am ']'

+ echo /tmp/am no exeble.

/tmp/am no exeble.

07:

判断/tmp/am 文件是否存在,存在的话就删除,然后再 touch 创建一个

这里的"&&"表示,前面的语句执行成功,则会执行后面的 rm 语句

[root@am-01:~/shell#] vim 12.sh

#!/bin/bash

f='/tmp/am'

[ -f $f ] && rm -rf $f

touch $f

[root@am-01:~/shell#] sh -x 12.sh

+ f=/tmp/am

+ '[' -f /tmp/am ']'

+ rm -rf /tmp/am

+ touch /tmp/am

08:

判断/tmp/am 文件是否存在,不存在的话 touch 创建一个,存在的话输出 Yes

这里的"||"表示,前面的语句执行不成功,则会执行后面的 touch 语句

[root@am-01:~/shell#] vim 13.sh

#!/bin/bash

f='/tmp/am'

[ -f $f ] || touch $f

09:

另一种判断/tmp/am 文件是否存在,不存在的话 touch 创建一个,存在的话输出 Yes 的写法

[root@am-01:~/shell#] vim 14.sh

#!/bin/bash

f='/tmp/am'

if [ ! -f $f ]

then

    touch $f

else

    echo 'Yes'

fi

[root@am-01:~/shell#] sh -x 14.sh

+ f=/tmp/am

+ '[' '!' -f /tmp/am ']'

+ echo Yes

Yes

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…

[ ] 中不能使用<,>,==,!=,>=,<=这样的符号

01:

先检查变量 n 的值是否为空,为空的话返回错误信息并退出,不为空的话再判断是否大于 100,大于 100 的话输出">100"

[root@am-01:~/shell#] vim 15.sh

#!/bin/bash

n=`wc -l /tmp/12345`

if [ -z "$n" ]

then

    echo "error"

    exit

elif [ $n -gt 100 ]

then

    echo ">100"

fi

[root@am-01:~/shell#] sh -x 15.sh

++ wc -l /tmp/12345

wc: /tmp/12345: 没有那个文件或目录

+ n=

+ '[' -z '' ']'

+ echo error

error

+ exit

02:

这里有两个脚本

第一个,判断变量 b 这个变量是否不为空,为空的话返回"b is null",不为空的话输出变量 b 的值

第二个,判断文件"shell/1.sh"是否不为空,不为空的话输出"ok"

[root@am-01:~/shell#] vim 16.sh

#!/bin/bash

b=""

if [ -n "$b" ]

then

    echo "$b"

else

    echo "b is null"

fi

if [ -n shell/1.sh ]

then

    echo "ok"

fi

[root@am-01:~/shell#] sh -x 16.sh

+ b=

+ '[' -n '' ']'

+ echo 'b is null'

b is null

+ '[' -n shell/1.sh ']'

+ echo ok

ok

03:

当你想查找当前系统中是否有 user1 用户,该怎么查找呢?

你可以使用 grep 语句,加上-w 参数可以精准匹配,只匹配 user1,而 user 或者 user11 不会匹配出来

[root@am-01:~/shell#] grep -w 'user1' /etc/passwd

user1:x:1001:1001::/home/user1:/bin/bash

同理,使用 shell 脚本做匹配

grep 有个-q 选项,能仅仅做过滤,不返回过滤的结果,适合 shell 脚本使用

查询/etc/passwd 中"user1"是否存在,存在则返回"yes"

在 shell 脚本中,一句命令的结果可以拿来做判断依据

[root@am-01:~/shell#] vim 17.sh

#!/bin/bash

if grep -wq 'user1' /etc/passwd

then

    echo 'yes'

fi

[root@am-01:~/shell#] sh -x 17.sh

+ grep -wq user1 /etc/passwd

+ echo yes

yes

case 判断

格式:

case  变量名 in

    value1)

        command                          

        ;;                     

    value2)                          

        command                          

        ;;                     

    *)                        

        commond                           

        ;;                     

esac

在 case 程序中,可以在条件中使用|,表示或的意思, 比如

2|3)    

    command   

    ;;

01:

看/etc/init.d/network 脚本,可以见到这是一个使用了 case 的脚本

当变量$1 为 start 时,做什么操作,为 stop 时,做什么操作,为 status 时,做什么操作,为 restart 或 reload 或 force-reload 时,做什么操作

[root@am-01:~/shell#] vim /etc/init.d/network

case "$1" in

start)

    ......

    ;;

stop)

    ......

    ;;

status)

    ......

    ;;

restart|reload|force-reload)

    ......

    ;;

esac

02:

脚本解析

[root@am-01:~/shell#] vim 18.sh

 #!/bin/bash

read -p "Please input a number: " n

if [ -z "$n" ]

then

    echo "Please input a number."

    exit 1

fi

#read 命令让用户输入字符串,把输入内容赋予变量 n,然后使用-z 判断用户有没有输入字符串变量 n,没输入的话返回提示要求输入数字,然后退出脚本并返回一个数值 1(每一条命令运行完成后都会返回一个值,这里的 exit 1 就跟 echo $?的值类似,为 1 则表示上一条命令运行不正确,为 0 则表示上一条命令运行正确)
n1=`echo $n|sed 's/[0-9]//g'`

if [ -n "$n1" ]

then

 echo "Please input a number."

 exit 1

fi

#定义变量 n1,用来判断上一条命令中输入的字符串是不是数字,这里的原理是输出变量 n 的值,然后使用 sed 把数字清空并赋值给变量 n1,判断变量 n1 是否为空,假如不为空的话,则就返回提示要求输入数字,然后退出脚本并返回一个数值 1
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

#经过上面两段脚本的判断,这次拿到了一个变量 n,这里拿这个变量 a 做比较

#当变量 a 的值小于 60 大于 0 时,tag=1;当变量 a 的值小于 80 大于 60 时,tag=2;当变量 a 的值小于 90 大于 80 时,tag=3;当变量 a 的值小于等于 100 大于 90 时,tag=4;假如都不是以上几种,就 tag=0
case $tag in

    1)

        echo "not ok"

        ;;

    2)

        echo "ok"

        ;;

    3)

        echo "ook"

        ;;

    4)

        echo "oook"

        ;;

    *)

        echo "The number range is 0-100."

        ;;

esac

#当标记 tag 为 1 的时候,返回 not ok;当标记为 2 的时候,返回 ok;当标记为 3 的时候,返回 ook;当标记为 4 的时候,返回 oook;除了以上四种 tag 外的,提示输入的范围必须得为 0-100 以内

测试一下

[root@am-01:~/shell#] sh -x 18.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@am-01:~/shell#] sh -x 18.sh

+ read -p 'Please input a number: ' n

Please input a number: 88

+ '[' -z 88 ']'

++ echo 88

++ sed 's/[0-9]//g'

+ n1=

+ '[' -n '' ']'

+ '[' 88 -lt 60 ']'

+ '[' 88 -ge 60 ']'

+ '[' 88 -lt 80 ']'

+ '[' 88 -ge 80 ']'

+ '[' 88 -lt 90 ']'

+ tag=3

+ case $tag in

+ echo ook

ook
[root@am-01:~/shell#] sh -x 18.sh

+ read -p 'Please input a number: ' n

Please input a number: sjdhf

+ '[' -z sjdhf ']'

++ echo sjdhf

++ sed 's/[0-9]//g'

+ n1=sjdhf

+ '[' -n sjdhf ']'

+ echo 'Please input a number.'

Please input a number.

+ exit 1