Linux 各種運算子

劉合棟發表於2019-02-08






- 算術運算子

算術運算子,常用的有+-*/%++--**


  • + - 加法運算子

    [root@www ~]$ expr 1 + 1
    2
    [root@www ~]$ echo $(( 1 + 1 ))
    2
  • - - 減法運算子

    [root@www ~]$ expr 1 - 1
    0
    [root@www ~]$ echo $(( 1 - 1 ))
    0
  • * - 乘法運算子

    [root@www ~]$ expr 2 \* 2
    4
    [root@www ~]$ echo $(( 2 * 2 ))
  • / - 除法運算子

    [root@www ~]$ expr 2 \/ 2
    1
    [root@www ~]$ echo $(( 2 / 2 ))
    1
  • % - 取餘運算子

    [root@www ~]$ expr 2 % 2
    0
    [root@www ~]$ echo $(( 10 % 2 ))
    0
  • ** - 冪運算子

    [root@www ~]$ echo $(( 2 ** 4 ))
    16
  • ++ - 增加運算子

    [root@www ~]$ variable=0
    [root@www ~]$ (( variable++ ))
    [root@www ~]$ echo $variable
    1
    #-------------------------------------
    [root@www ~]$ variable=0
    [root@www ~]$ let variable++
    [root@www ~]$ echo $variable
    1
  • -- - 減少運算子

    [root@www ~]$ variable=100
    [root@www ~]$ (( variable-- ))
    [root@www ~]$ echo $variable
    99
    #------------------------------------
    [root@www ~]$ variable=100
    [root@www ~]$ let variable--
    [root@www ~]$ echo $variable
    99






- 關係運算子

關係運算子,常用的有<<=>>====!=

  • < - 小於運算子

    [root@www ~]$ echo $(( 1 < 2 ))
    1   # 返回值為0表示(false),返回值為1表示(true)
    
    [root@www ~]$ (( 1 < 2 ));echo $?
    0   # 返回值為0表示(tree),返回值為1表示(false)
    
    [root@www ~]$ [[ 1 < 2 ]];echo $?
    0   # 返回值為0表示(true),返回值為1表示(false)
    
  • <= - 小於或等於運算子

    [root@www ~]$ echo $(( 1 <= 2 ))
    1   # 返回值為0表示(false),返回值為1表示(true)
    
    [root@www ~]$ (( 1 < 2 ));echo $?
    0   # 返回值為0表示(tree),返回值為1表示(false)
  • > - 大於運算子

    [root@www ~]$ echo $((1 > 2))
    1   # 返回值為0表示(false),返回值為1表示(true)
    
    [root@www ~]$ ((1 > 2));echo $?
    0   # 返回值為0表示(tree),返回值為1表示(false)
    
    [root@www ~]$ [[ 1 > 2 ]];echo $?
    0   # 返回值為0表示(true),返回值為1表示(false)
  • >= - 大於或等於運算子

    [root@www ~]$ echo $((1 >= 2))
    1   # 返回值為0表示(false),返回值為1表示(true)
    
    [root@www ~]$ ((1 >= 2));echo $?
    0   # 返回值為0表示(tree),返回值為1表示(false)
  • = - 等於運算子

    [root@www ~]$ [ "word" = "word" ];echo $?
    # 該行為是進行字串比較
    [root@www ~]$ [[ "word" = "word" ]];echo $?
    # 該行為是進行字串比較
  • == - 等於運算子

    [root@www ~]$ expr 1 == 1
    1   # 返回值為0表示(false),返回值為1表示(true)
    
    [root@www ~]$ echo $((1 == 1))
    1   # 返回值為0表示(false),返回值為1表示(true)
    
    [root@www ~]$ ((1 == 1));echo $?
    0   # 返回值為0表示(true),返回值為1表示(false)
    
    [root@www ~]$ [[ 1 == 1 ]];echo $?
    0   # 返回值為0表示(true),返回值為1表示(false)
  • != - 不等於運算子

    [root@www ~]$ expr 1 != 1
    0   # 返回值為0表示(false),返回值為1表示(true)
    
    [root@www ~]$ echo $((1 != 1))
    0   # 返回值為0表示(false),返回值為1表示(true)
    
    [root@www ~]$ ((1 != 1));echo $?
    1   # 返回值為0表示(true),返回值為1表示(false)
    
    [root@www ~]$ [[ 1 != 1 ]];echo $?
    1   # 返回值為0表示(true),返回值為1表示(false)






- 邏輯運算子

邏輯運算子,常用的有&&||!

  • && - 邏輯與運算子

    [root@www ~]$ make && make install
    # 只有當make命令成功執行時,才會執行後面的語句
    [root@www ~]$ [ -f /etc/passwd -a -d /etc ];echo $?
    # -a 等同於 &&
  • || - 邏輯或運算子

    [root@www ~]$ make || echo "Make failed !"
    # 當make執行失敗時,才會執行後面的語句
    [root@www ~]$ [ -f /etc/passwd -o -d /etc];echo $?
    # -o 等同於 ||
  • ! - 邏輯非運算子

    [root@www ~]$ [ 1 -eq 1 ];echo $?
    0
    [root@www ~]$ [ ! 1 -eq 1 ];echo $?
    1
    # !真 = 假 , !假 = 真
    # 也就是將結果取反,如果表示式為0則返回1,為1則返回0、






- 按位運算子

按位運算子,常用的有&|^~<<>>

  • & - 按位與運算子

    [root@www ~]$ echo $((0 & 0))
    0
    [root@www ~]$ echo $((0 & 1))
    0
    [root@www ~]$ echo $((1 & 0))
    0
    [root@www ~]$ echo $((1 & 1))
    1
    # 由此得出,只有當兩邊的值都為true時,結果才為true
  • | - 按位或運算子

    [root@www ~]$ echo $(( 0 | 0 ))
    0
    [root@www ~]$ echo $(( 0 | 1 ))
    1
    [root@www ~]$ echo $(( 1 | 0 ))
    1
    [root@www ~]$ echo $(( 1 | 1 ))
    1
    # 由此得出,只要有一個值為true,則結果為true
  • ^ - 異或運算子

    [root@www ~]$ echo $(( 0 ^ 0 ))
    0
    [root@www ~]$ echo $(( 0 ^ 1 ))
    1
    [root@www ~]$ echo $(( 1 ^ 0 ))
    1
    [root@www ~]$ echo $(( 1 ^ 1 ))
    0
    
    #-----------------------------------------------
    # 異或是運算二進位制,兩個值進行運算,同號為0,異號為1,例如:
    [root@www ~]$ echo $((99^88))   # 開始運算,異或後為59,為什麼?
    59
    
    # 這裡為運算的過程,99和88進行異或,如果兩個都是一樣的就是0,不一樣就是1
    [root@www ~]$ echo "obase=2;ibase=10;99"|bc     # 得出99的二進位制
    1011000
    [root@www ~]$ echo "obase=2;ibase=10;88"|bc     # 得出88的二進位制
    1100011
    # 99 = 1011000      
    # 88 = 1100011
    # 59 = 0111011  # 此處為上面兩個二進位制運算後的結果,
    [root@www ~]$ echo "obase=10;ibase=2;0111011"|bc
    59
    # 最終結果是正確的,常用於互換兩個變數的值,但該值一定是整數
  • ~ - 取反運算子

    [root@www ~]$ echo $(( ~9 ))
  • << - 左移運算子

    [root@www ~]$ echo $((1<<2))
  • >> - 右移運算子

    [root@www ~]$ echo $((2>>1))






- 檔案測試符

檔案測試有很多,如下:
-n - 檢測字元長度是否為0,不為0則返回true

-z - 檢測字元長度是否為0,為0則返回true

-eq - 等於

-ge - 大於等於

-gt - 大於

-le - 小於等於

-lt - 小於

-ne - 不等於

-ef - 判斷 file1file2 是否具有相同的裝置和inode編號

-nt - 判斷 filefile2 哪一個檔案比較新

-ot - 判斷 filefile2 哪一個檔案比較舊

-b - 判斷檔案是否存在,並且是塊裝置檔案

-c - 判斷檔案是否存在,並且是字符裝置檔案

-d - 判斷檔案是否存在,並且是目錄

-e - 判斷檔案是否存在

-f - 判斷檔案是否存在,並且是普通檔案

-g - 判斷檔案是否存在,並且設定了SGID位

-G - 判斷檔案是否存在,並且GID有效

-h - 判斷檔案是否存在,並且是一個符號連結(與-L相同)

-k - 判斷檔案是否存在,並且設定了粘著位

-L - 判斷檔案是否存在,並且是一個符號連結(與-h相同)

-O - 判斷檔案是否存在,並且UID有效

-p - 檢測檔案是否存在,並且具備命名管道

-r - 判斷檔案是否存在,並且具備讀許可權

-s - 判斷檔案是否存在,並且大小大於0

-S - 判斷檔案是否存在,並且是一個套接字

-t - 檔案描述符是在一個終端開啟的

-u - 判斷檔案是否存在,並且設定了SUID位

-w - 判斷檔案是否存在,並且具備寫許可權

-x - 判斷檔案是否存在,並且具備執行許可權




相關文章