bash的算術運算和條件測試語句


利用bash腳本編程實現算數運算:
  +:
  -:
  *:
  \:
  %:模運算,取餘數
  **:乘方 ^

  增強型的算術運算符號:
  +=:let B=B+2 -->let B+=2
  -=:
  *=:
  /=:
  %=:

  特殊的增強型的算術運算:
    1.let B=B+1 -->let B+=1 -->let B++

  B++:先將B的值賦給其他變量,然後再自身加一;
  ++B:先將自身加一,然後再將值賦給其他變量;

#A=4

#let A++

#echo $A

5

#let SUM=2+3

#echo $SUM

5

#echo "the sum of 2+3 is `expr 2+3`"


    2.VAR+$[算術表達式]
    算術表達式中如果有變量引用,可以使用$引用,也可以省略$

#SUM=$[2+3]

#echo $SUM

5

#DAYS=$[$(`date +%s`)/24/60/60]

15602  (計算從1970年1月1日到現在經歷的整數天)

#SUM=$[$A+$B]

    3.VAR=$((算術表達式))
    算術表達式中如果有變量引用,可以使用$引用,也可以省略$

#SUM=$((3/2))

#echo $SUM

1   (bash只進行整數運算,小數部分被忽略)

#SUM=(($A+$B))

    4.expr ARGU1 ARGU2 ARGU3
    ARGU1和ARGU3必須是數值;
    ARGU2必須是運算符號;



    5.echo "算術表達式" | bc

    注意:*號,在某些情況下需要轉義

    例子:
      統計/etc/fstab


  算術運算方法:
    1.let VAR=算術表達式
      將算術表達式先行進行算術運算,並將算術得到的結果保存到變量VAR中;

  變量:存儲數據的一個容器
    弱變量:弱類型變量,字符型(默認),數值型(不包括浮點型)

  條件測試命令:

    test EXPERSSION
      shell內建命令:

    [ eEXPERSSION ]
      外部命令[ :
    ` EXPERSSION`    
      bash的內部關鍵字:

    注意:這類命令一般沒有執行結果,只有執行狀態返回值;

    test測試命令有三類測試表達式:
      1.數值測試
       -eq:被測試的兩個數值是否相等,相等爲真,不等爲假;
       -ne:被測試的兩個數值是不相等,相等爲假,不等爲真;
       -gt:被測試的兩個數值,左面的是否大於右面的,大於爲真,不大於爲假;
       -lt:被測試的兩個數值,左面的是否小於右面的,小於爲真,不小於爲假;
       -ge: 被測試的兩個數值,左面的是否大於等於右面的,大於等於爲真,小於爲假;
       -le:被測試的兩個數值,左面的是否小於等於右面的,小於等於爲真,大於爲假;

      2.字符串測試
        雙目操作符:
          ==:被測試的兩個字符串是否相同,相同爲真,不相同爲假;
          !=:被測試的兩個字符串是否相同,不相同爲真,相同爲假;
          >:被測試的兩個字符串在ASCII碼錶中對應的二進制數值左邊是否大於右邊,大於爲真,小於爲假;
          <:被測試的兩個字符串在ASCII碼錶中對應的二進制數值左邊是否小於右邊,小於爲真,大於爲假;
            注意:<和>必須用在` EXPERSSION`的測試語句中;

          =~:被測試的兩個字符串左邊字符串是否能被右邊的PATTERN匹配,能匹配爲真,不能匹配爲假;
        單目操作符:
          -z 'STEING':判斷指定的字符串是否爲空串,空爲真,不空爲假;
          -n 'STEING':判斷指定的字符串是否爲非空串,非空爲真,空爲假;

        注意:
        1.通常情況下,字符串要加引號,單引號或雙引號都行,根據實際情況選擇即可;
        2.[[]]和[]在某些情況下可能意義不同,要區分使用;
        3.表達式的兩端以及操作符的兩端都要加空格;

      3.文件狀態測試
        文件的存在性測試:如果被測試的文件存在,爲真,不存在,爲假;
          -a | -e :
           [ -e /etc ]
         文件類型測試(先測試存在性):
          -b FILE:被測試的文件是否存在並且是否爲塊設備;存在且爲真,否則爲假;
          -c FILE: 被測試的文件是否存在並且是否爲字符設備;...
          -d FILE: 被測試的文件是否存在並且是否爲目錄文件;...
          -f FILE:被測試的文件是否存在並且是否爲普通文件;...
          -h | -L FILE:被測試的文件是否存在並且是否爲符號鏈接文件;...
          -p FILE:被測試的文件是否存在並且是否爲管道文件;...
          -S FILE:被測試的文件是否存在並且是否爲套接字文件;...

        文件的訪問權限設置:
          -r FILE:被測試的文件是否存在並且當前有效用戶是否可讀;文件存在並且可讀爲真,否則爲假;
          -w FILE:被測試的文件是否存在並且當前有效用戶是否可寫;...
          -x FILE:被測試的文件是否存在並且當前有效用戶是否可執行;...

        文件的特殊權限標識測試:
          -u FILE:被測試的文件是否存在並且是否設置了SUID權限,文件存在並且設置了SUID權限爲真,否則爲假;
          -g FILE:被測試的文件是否存在並且是否設置了SGID權限;
          -k FILE:被測試的文件是否存在並且是否設置了STICKY權限;

        文件的所有權測試:
          -O FILE:被測試的文件是否存在且屬主是否爲當前有效用戶,
          -G FILE:被測試的文件是否存在且屬組是否爲當前有效用戶的組,

        文件是否爲空:
          -s FILE:被測試的文件是否存在且內容不空,不空爲真,否則爲假;

        時間戳測試:
          -N FILE:被測試的文件自從上一次被修改之後,是否被修改過;

      雙目測試:
        FILE -ef FILE2:被測試的兩個文件是指向同一個文件系統的相同inode的硬鏈接;
        FILE -nt FILE2:被測試的兩個文件FILE1是否比FILE2更新;
        FILE -ot FILE2:被測試的兩個文件FILE1是否比FILE2更舊;

測試語句中可以添加邏輯運算:
  第一種表達方式:
  [ -o /tmp/test ] && [ -s /tmp/test ]
  [ -o /tmp/test ] || [ -s /tmp/test ]

  第二種表達方式:
  [ -o /tmp/test -a -s /tmp/test ]
  [ -o /tmp/test -o -s /tmp/test ]

命令的執行結果:
  正常的輸出結果:

  命令的執行狀態返回值:
  0-255
  0:
  1,2,127:系統保留的
  3-126,128-255:用戶自定義的執行狀態返回值

  exit [#]
    退出當前shell的登陸;

    當shell腳本運行是,一旦遇到exit命令,將立即結束當前shell進程,同時腳本的運行也將被停止,即exit後面的所有命令不再被解釋執行;


 shell腳本編程:
  shell腳本的內容和格式:
    首行必須要佔據絕對行首,shebang(解釋器程序的絕對路徑)
    註釋信息:以#佔據絕對行首的行;增加源代碼的可讀性
    爲了能夠在程序中突出程序的功能,適當的添加空白行,以分隔不同功能的源代碼塊;
    有一定的縮進


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章