Shell腳本編程算術運算和條件測試

算術運算

一、bash中的算術運算:help let
        +, -, *, /, %取模(取餘), **(乘方)
        實現算術運算:
                (1) let var=算術表達式
                (2) var=$[算術表達式]
                (3) var=$((算術表達式))
                (4) var=$(expr arg1 arg2 arg3 ...)
                (5) declare –ivar= 數值
                (6) echo ‘算術表達式’ | bc
二、乘法符號有些場景中須要轉義,如*
三、bash有內建的隨機數生成器:
            $RANDOM(0-32767)
            echo $[$RANDOM%50] :0-49之間隨機數

賦值

一、加強型賦值:
        +=, -=, *=, /=, %=
二、let varOPERvalue
            例如:let count+=3
                    自加3後自賦值
三、自增,自減:
            let var+=1
            let var++
            let var-=1
            let var--

邏輯運算

一、true, false
            1, 0
二、與:(&)
            1 與1 = 1
            1 與0 = 0
            0 與1 = 0
            0 與0 = 0
------------------------------------
    與運算能夠理解爲而且的關係
            1表明真
            0表明假
                一個真和一個假與的結果是假
                有一個假的與出來的結果就是假的

    得出結論:
                誰和1與的保留原值
                和0與的無論是什麼結果都是0
------------------------------------
三、或:(|)
    1 或1 = 1
    1 或0 = 1
    0 或1 = 1
    0 或0 = 0
------------------------------------
    或運算:
        真和真或結果爲真
        1 || 1 = 1
        真和假或結果也爲真
        1 || 0  = 1
        假和真或結果也是真
        0 || 1 = 1
        只有兩個爲假是結果才爲假
        0 || 0 = 0

        結論:
            和真與的結果爲真
            和假與的保留原值
------------------------------------

邏輯運算

一、非:!
    ! 1 = 0
    ! 0 = 1
二、短路運算
    短路與 (&&)
        第一個爲0,結果一定爲0
        第一個爲1,第二個必需要參與運算
    短路或 (||)
        第一個爲1,結果一定爲1
        第一個爲0,第二個必需要參與運算
三、異或:^
    異或的兩個值,相同爲假,不一樣爲真
------------------------------------------
示例:判斷一個文件是否存在,若是存在就給文件加上執行權限
    一、文件存在時。後續命令繼續執行
    [root@node1 ~]#ls anaconda-ks.cfg &> /dev/null && chmod +x anaconda-ks.cfg 
    [root@node1 ~]#ll
    total 1244
    -rwx--x--x. 1 root root    1559 Jul 18 20:55 anaconda-ks.cfg

    二、文件不存在時。後續命令就再也不執行了
    [root@node1 ~]#ls an &> /dev/null && chmod +x an
    [root@node1 ~]#echo $?
    2
示例:判斷一個帳號是否存在,不存在則建立此帳號
    [root@node1 ~]#id coodf &> /dev/null || useradd coodf
    [root@node1 ~]#echo $?
    0
    [root@node1 ~]#getent passwd coodf
    coodf:x:1004:1004::/home/coodf:/bin/bash
    [root@node1 ~]#
示例;用異或來兌換兩個數字的位置
[root@node1~/bin]#a=10;b=7;a=$[a^b];b=$[a^b];a=$[a^b]; echo $a $b 
    7 10
------------------------------------------

條件測試

一、判斷某需求是否知足,須要由測試機制來實現
        專用的測試表達式須要由測試命令輔助完成測試過程
二、評估布爾聲明,以便用在條件性執行中
        •若真,則返回0
        •若假,則返回1
三、測試命令:
        •test EXPRESSION
        •[ EXPRESSION ]
        •[[ EXPRESSION ]]
            [[ EXPRESSION ]]
                == 相同,字符串不要加"",支持通配符
                =~ 匹配,字符串不要加"",支持擴展正則表達式
        注意:EXPRESSION先後必須有空白字符
-------------------------------------------------
避免空值的寫法 加X便可
    [root@node2 ~]#[ X"$name" = X"$title" ] && echo true || echo false  
    false

    [[ ]] 變量要加"" 正則表達式不用加""
    [root@node3 ~]#var=abc;[[ "$var" =~ ^a ]] && echo true|| echo false
    true

    判斷是否以.conf結尾
    [root@node3 ~]#filename=a.conf
    [root@node3 ~]#[[ "$filename" =~ \.conf$ ]] &&echo true || echo false
    true

    [root@node3 ~filename=a.con
    [root@node3 ~[[ "$filename" =~ \.conf$ ]] && echo true || echo false
    false

    判斷一個是否爲文件而且這個文件是否有寫權限,若是有寫權限就給它去掉
    [root@node3 ~]#file=/etc/issue;[ -f $file -a -w $file ] && chmod -w $file

    判斷一個是否爲文件或者這個文件是否有寫權限,若是有寫權限就給它去掉
    [root@node3 ~]#file=/etc/issue;[ -f $file -a -w $file ] && chmod -w $file

    判斷一個文件不具備寫權限,若是沒有就給它加上寫權限
    [root@node3 ~]#file=/etc/issue;[ ! -w $file ] && chmod +w $file 

    判斷一個文件是否具備執行權限,若是沒有就給它加上執行權限
    [root@node3 ~]#file=/etc/shadow ; [ ! -x $file ] && chmod +x $file
    [root@node3 ~]#ll /etc/shadow
    ---x--x--x 1 root root 1220 Sep 22 08:26 /etc/shadow
    [root@node3 ~]#
----------------------------------------------------------

條件性的執行操做符

根據退出狀態而定,命令能夠有條件地運行
    •&& 表明條件性的AND THEN
    •|| 表明條件性的OR ELSE
-------------------------------------
示例:
[root@node3 ~]#grep -q no_such_user /etc/passwd || echo 'No such user'
No such user

test命令

一、長格式的例子:
    test "$A"="$B"&&echo"Stringsareequal"
    test「$A」-eq「$B」&&echo"Integersareequal"
二、簡寫格式的例子:
    ["$A"="$B"]&&echo"Stringsareequal"
    ["$A"-eq"$B"]&&echo"Integersareequal"

bash的數值、字符串測試

一、-v VAR
    變量VAR是否設置
二、數值測試:
    -gt是否大於
    -ge是否大於等於
    -eq是否等於
    -ne是否不等於
    -lt是否小於
    -le是否小於等於
三、字符串測試:
    =是否等於
    >ascii碼是否大於ascii碼
    <是否小於
    !=是否不等於
    =~左側字符串是否可以被右側的PATTERN所匹配
    注意: 此表達式通常用於[[ ]]中;擴展的正則表達式
    -z "STRING「字符串是否爲空,空爲真,不空爲假
    -n "STRING「字符串是否不空,不空爲真,空爲假
四、注意:用於字符串比較時的用到的操做數都應該使用引號

Bash的文件測試

一、存在性測試
    -a FILE:同-e
    -e FILE: 文件存在性測試,存在爲真,不然爲假
二、存在性及類別測試
    -b FILE:是否存在且爲塊設備文件
    -c FILE:是否存在且爲字符設備文件
    -d FILE:是否存在且爲目錄文件
    -f FILE:是否存在且爲普通文件
    -h FILE 或-L FILE:存在且爲符號連接文件
    -p FILE:是否存在且爲命名管道文件
    -S FILE:是否存在且爲套接字文件
三、文件權限測試:
    -r FILE:是否存在且可讀
    -w FILE: 是否存在且可寫
    -x FILE: 是否存在且可執行
四、文件特殊權限測試:
    -u FILE:是否存在且擁有suid權限
    -g FILE:是否存在且擁有sgid權限
    -k FILE:是否存在且擁有sticky權限
五、文件大小測試:
    -s FILE: 是否存在且非空
六、文件是否打開:
    -t fd: fd文件描述符是否在某終端已經打開
    -N FILE:文件自從上一次被讀取以後是否被修改過
    -O FILE:當前有效用戶是否爲文件屬主
    -G FILE:當前有效用戶是否爲文件屬組
七、雙目測試:
    FILE1 -efFILE2: FILE1是不是FILE2的硬連接
    FILE1 -ntFILE2: FILE1是否新於FILE2(mtime)
    FILE1 -otFILE2: FILE1是否舊於FILE2

Bash的組合測試條件

一、第一種方式:
        COMMAND1 && COMMAND2 而且
        COMMAND1 || COMMAND2 或者
        ! COMMAND 非
        如:[[ -r FILE ]] && [[ -w FILE ]]
二、第二種方式:
        EXPRESSION1 -a EXPRESSION2 而且
        EXPRESSION1 -o EXPRESSION2 或者
        ! EXPRESSION
        必須使用測試命令進行
相關文章
相關標籤/搜索