1. 程式人生 > >Shell腳本編程算術運算和條件測試

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

ech 符號 文件屬組 iss 如果 rand 大於等於 code 數值

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

賦值

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

邏輯運算

1、true, false
            1, 0
2、與:(&)
            1 與1 = 1
            1 與0 = 0
            0 與1 = 0
            0 與0 = 0
------------------------------------
    與運算可以理解為並且的關系
            1代表真
            0代表假
                一個真和一個假與的結果是假
                有一個假的與出來的結果就是假的

    得出結論:
                誰和1與的保留原值
                和0與的不管是什麽結果都是0
------------------------------------
3、或:(|)
    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、非:!
    ! 1 = 0
    ! 0 = 1
2、短路運算
    短路與 (&&)
        第一個為0,結果必定為0
        第一個為1,第二個必須要參與運算
    短路或 (||)
        第一個為1,結果必定為1
        第一個為0,第二個必須要參與運算
3、異或:^
    異或的兩個值,相同為假,不同為真
------------------------------------------
示例:判斷一個文件是否存在,如果存在就給文件加上執行權限
    1、文件存在時。後續命令繼續執行
    [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

    2、文件不存在時。後續命令就不再執行了
    [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
------------------------------------------

條件測試

1、判斷某需求是否滿足,需要由測試機制來實現
        專用的測試表達式需要由測試命令輔助完成測試過程
2、評估布爾聲明,以便用在條件性執行中
        ?若真,則返回0
        ?若假,則返回1
3、測試命令:
        ?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命令

1、長格式的例子:
    test "$A"="$B"&&echo"Stringsareequal"
    test“$A”-eq“$B”&&echo"Integersareequal"
2、簡寫格式的例子:
    ["$A"="$B"]&&echo"Stringsareequal"
    ["$A"-eq"$B"]&&echo"Integersareequal"

bash的數值、字符串測試

1、-v VAR
    變量VAR是否設置
2、數值測試:
    -gt是否大於
    -ge是否大於等於
    -eq是否等於
    -ne是否不等於
    -lt是否小於
    -le是否小於等於
3、字符串測試:
    =是否等於
    >ascii碼是否大於ascii碼
    <是否小於
    !=是否不等於
    =~左側字符串是否能夠被右側的PATTERN所匹配
    註意: 此表達式一般用於[[ ]]中;擴展的正則表達式
    -z "STRING“字符串是否為空,空為真,不空為假
    -n "STRING“字符串是否不空,不空為真,空為假
4、註意:用於字符串比較時的用到的操作數都應該使用引號

Bash的文件測試

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

Bash的組合測試條件

1、第一種方式:
        COMMAND1 && COMMAND2 並且
        COMMAND1 || COMMAND2 或者
        ! COMMAND 非
        如:[[ -r FILE ]] && [[ -w FILE ]]
2、第二種方式:
        EXPRESSION1 -a EXPRESSION2 並且
        EXPRESSION1 -o EXPRESSION2 或者
        ! EXPRESSION
        必須使用測試命令進行

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