十七週一次課

十七週一次課linux

20.5shell邏輯判斷shell

20.6文件屬性判斷vim

20.7if特殊用法bash

20.8-20.9case判斷spa

20.5shell邏輯判斷文檔

邏輯表達式

在[ ]中括號中:字符串

  • -lt:=little than 小於
  • -le:=little && equal 小於等於
  • -eq:=equal 等於
  • -ne:=no equal 不等於
  • -gt:=greater than 大於
  • -ge:=greater && equal 大於等於

在(( ))小括號中:
<,<=,==,!=,>,>=
get

注意: 使用雙括號括起來input

[root@tianqi-01 ~]# for i in `seq 1 5`; do echo $i; done
1
2
3
4
5
[root@tianqi-01 ~]# 
it

有時候不用寫腳本,1條命令足矣。

[root@tianqi-01 ~]# for i in `seq 1 5`
> do
> echo $i
> done
1
2
3
4
5
[root@tianqi-01 ~]# 

這條命令也能夠不用分割,效果相同。

格式1

if 條件 ;then commond;fi

[root@tianqi-01 ~]# a=5
[root@tianqi-01 ~]# if [ $a -gt 3 ]

> then
> echo ok
> fi
ok

[root@tianqi-01 ~]# if [ $a -gt 3 ]; then echo ok; fi
ok
[root@tianqi-01 ~]# 

[root@tianqi-01 shell]# vim if1.sh 

#!/bin/bash
a=5
if [ $a -gt 3 ]
then
        echo "ok"
fi

[root@tianqi-01 shell]# sh if1.sh 
ok

格式2

if 條件1;then commond1;else commond2;fi

[root@tianqi-01 shell]# vim if2.sh 

#!/bin/bash

a=5

if [ $a -gt 3 ]

#注意[]內的空格

then

    echo "ok"

else

    echo "fault"

fi

[root@tianqi-01 shell]# sh if2.sh 
ok

[root@tianqi-01 shell]# sh -x if2.sh
+ a=5
+ '[' 5 -gt 3 ']'
+ echo ok
ok
[root@tianqi-01 shell]# 

格式3

if 條件1;then commond1;elif 條件2;then commond2;else commond3;fi

[root@tianqi-01 shell]# vim if3.sh

a=5
if [ $a -lt 3 ]
then
        echo "a<3"
elif [ $a -gt 6 ]
then
        echo "a>6"
else
        echo "Out of the zone"
fi

[root@tianqi-01 shell]# sh if3.sh 
Out of the zone

[root@tianqi-01 shell]# sh -x if3.sh
+ a=5
+ '[' 5 -lt 3 ']'
+ '[' 5 -gt 6 ']'
+ echo 'Out of the zone'
Out of the zone
[root@tianqi-01 shell]# 

關係

各個條件之間的關係可使用邏輯鏈接符:

條件A&&條件B:而且
條件A||條件B:或者

20.6文件屬性判斷

shell腳本中if常常用於判斷文檔的屬性,好比判斷是普通文件仍是目錄文件,判斷文件是否有讀、寫、執行權限等。if經常使用的選項有如下幾個:

-e:判斷文件或目錄是否存在

-d:判斷是否是目錄文件以及是否存在

-f:判斷是否是普通文件以及是否存在

-r:判斷是否有讀權限

-w:判斷是否有寫權限

-x:判斷是否有執行權限

格式

若是某文件存在:

if [ -e filename ]

then

     commond

fi

以上命令可簡化爲:

[ -e filename ] && commond

&&先後的命都執行

或:

[ -e filename ] || commond

當 || 前面的執行不成功時再執行後面的命令

若是某文件不存在:

if [ ! -e filename ]

then

    commond

fi

「!」等同於取反。

[root@localhost shell]# vim file1.sh

#!/bin/bash
a="/tmp/aminglinux"
if [ -f $a ]
then
    echo $a exist
else
    touch $a
f

[root@localhost tmp]# sh -x file1.sh 
+ a=/tmp/aminglinux
+ '[' -f /tmp/aminglinux ']'
+ touch /tmp/aminglinux

20.7if特殊用法

if [ -z "$a" ]:表示當變量a的值爲空時會怎樣

if [ -n "$a" ]:表示當變量a的值不爲空時會怎樣

-z和-n爲相反的兩個反條件。

[root@tianqi-01 shell]# vim if.sh

#!/bin/bash

n=`wc -l /tmp/test.txt`

if [ $n -gt 20 ]

then

    echo 1

else

    echo 0

fi

在該腳本中無語法錯誤,只是咱們預設/tmp/test.txt是存在的,若是該文件不存在,該腳本執行的時候就會報錯:

[root@tianqi-01 shell]# sh if.sh
wc: /tmp/test.txt: No such file or directory
if.sh: line 5: [: -gt: unary operator expected
if.sh: line 13: $'\302\240\302\240\302\240\302\240echo': command not found
[root@tianqi-01 shell]# 

因此,爲了不這種錯誤的發生,須要將腳本寫的更加嚴謹,須要在執行「if [ $n -gt 20 ]」以前先確認文件「/tmp/test.txt」是否存在:

[root@tianqi-01 shell]# vim exit.sh

#!/bin/bash
n=`wc -l /tmp/test.txt`
if [ -z $n ]
then
        echo "error"
        exit
elif [ $n -lt 20 ]
then
        echo 1
else
        echo 0
fi

即,若是變量n爲空則顯示error並退出該腳本。

[root@tianqi-01 shell]# sh exit.sh
wc: /tmp/test.txt: No such file or directory
error

即,當該文件不存在的時候就會退出執行,不會提示存在語法錯誤。(該腳本存在邏輯錯誤,只作效果演示用)

注意: 在該表達式中引用變量時要用雙引號引發來。

判斷某參數存在:

[root@tianqi-01 shell]# vim exit1.sh

#!/bin/bash
if grep -wq 'user1' /etc/passwd
then
        echo "user1 exit"
fi

[root@tianqi-01 shell]# sh exit1.sh
user1 exit

判斷某參數不存在

[root@tianqi-01 shell]# vim exit1.sh

#!/bin/bash
if  !  grep -wq 'user1' /etc/passwd
then
        echo "user1 exit"
fi

[root@tianqi-01 shell]# sh exit1.sh

說明: grep中-w選項=Word,表示過濾一個單詞;-q,表示不打印過濾的結果。判斷某參數不存在時使用!表示取反。

20.8-20.9case判斷

格式:

case 變量名 in

     value1)

         commond1

         ;;

        value2)

            commod2

            ;;

        value3)

            commod3

            ;;

        *)  

            commod3

            ;;

esac

在case中,能夠在條件中使用「|」,表示或的意思,如:

2|3)

    command

    ;;

[root@tianqi-01 shell]# vim case1.sh

#!/bin/bash

#判斷是否輸入有數值,空直接結束整個文本
read -p "Please input a number:" n

#read 讓用戶輸出一些字符串,賦值給最後一個變量,這裏的賦值是「n」
if [ -z "$n" ]                                                    //變量n爲空
then
        echo "Please input a number."
        exit 1

#「exit 1」表示執行該部分命令後的返回值 ,即,命令執行完後使用echo $?的值
fi

n1=`echo $n|sed 's/[0-9]//g'`

#判斷用戶輸入的字符是否爲純數字 ,若是是數字,則將其替換爲空,賦值給$n1
if [ -n "$n1" ]
then
        echo "Please input a number."
        exit 1

#判斷$n1不爲空時(即$n不是純數字)再次提示用戶輸入數字並退出
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

#tag的做用是爲判斷條件設定標籤,方便後面引用

case $tag in
        1)
                echo "not ok"
                ;;
        2)
                echo "ok"
                ;;
        3)
                echo "ook"
                ;;
        4)
                echo "oook"
                ;;
        *)
                echo "The number rang is 0-100."
                ;;
esac

說明: 該腳本的做用是輸入考試成績,判斷考試成績的等級。

[root@tianqi-01 shell]# sh case1.sh
Please input a number:95
oook
[root@tianqi-01 shell]# sh case1.sh
Please input a number:82
ook
[root@tianqi-01 shell]# sh case1.sh
Please input a number:63
ok
[root@tianqi-01 shell]# sh case1.sh
Please input a number:35
not ok

知識點 1

  • shell 中 exit0 exit1 的區別:
    • exit(0):正常運行程序並退出程序;
    • exit(1):非正常運行致使退出程序;
    • exit 0 能夠告知你的程序的使用者:你的程序是正常結束的。若是 exit 非 0 值,那麼你的程序的使用者一般會認爲你的程序產生了一個錯誤。
    • 在 shell 中調用完你的程序以後,用 echo $? 命令就能夠看到你的程序的 exit 值。在 shell 腳本中,一般會根據上一個命令的 $? 值來進行一些流程控制。

 

友情連接:阿銘linux

相關文章
相關標籤/搜索