天天看點

Linux系統Bash(Shell)基礎知識(3)

  在shell腳本程式設計中算術運算無疑是十分重要的;

  bash中執行整數算數運算的指令是let,其文法格式為:

  let arg...

  arg為單獨的算術表達式如+,-,*,/,%,^等所構成的完整的算術表達式;

  其中^為平方運算,如2^3表示2的三次方;

  let指令可以使用如下方式替代:

  ((算術表達式))

  例如

  [root@localhost wjq]# let "a=2*3"

  [root@localhost wjq]# echo $a

  6

  [root@localhost wjq]# (("a=3*3"))

  9

  除了簡單的加減乘除運算,算術運算中還包括增強型運算方式和特殊的增強型運算方式;

  增強型運算方式:

  +=:如a+=b-->a=a+b

  -+:如a-=b-->a=a-b

  *=:如a*=b-->a=a*b

  %=:如a%=b-->a=a%b

  /=:如a/=b-->a=a/b

  轉化為let指令運算為:

  [root@localhost wjq]# b=5

  [root@localhost wjq]# let "a+=b"

  14

  [root@localhost wjq]# 

  特殊增強型運算:

  a++:a先将值賦給變量,再+1;

  ++a:a先+1,再将值賦給變量;

  a--:a先将值賦給變量,再-1;

  --a:a先-1,再将值賦給變量;

  轉化為let指令的運算方式為:

  [root@localhost wjq]# a=4

  [root@localhost wjq]# let "a++"

  10

  算術運算方法:

  ① let VAR=算術表達式

    #let “B=5+4”

    #echo $B

    将算術表達式先行進行算術運算,并将運算得到的結果儲存到變量VAR;

    變量:存儲資料的容器

    弱變量:弱類型變量,預設是字元型變量,數值型(不包括浮點型)

  ② VAR=$[算術表達式]

  [root@localhost wjq]# a=$[a*b]

  50

  ③ VAR=$((算術表達式))

  算術表達式中如果有引用就用$引用,也可以省略

  [root@localhost wjq]# a=$((a*b))

  250

  ④ exper ARGU1 ARGU2 ARGU3

          ARGU1和ARGU3 必須是數值

          ARGU2是運算符

  ⑤ echo “算術表達式” | bc(bc指令相當于電腦)

  [root@localhost wjq]# echo "3*4" | bc

  12

 條件測試語句:

  條件測試有三種測試語句

  一是test指令;

  二是用一堆方括号将其括起來,而這是完全等價的;

  test -f "/etc/passwd" 完全等價于 [ -f "/etc/passwd" ]

  三是[[條件表達式]];

  這三種表達式可以和多種系統運算符結合使用,這些系統運算符可以分為四類:數值測試運算符,字元串測試運算符,檔案狀态測試運算符,邏輯測試運算符;

  下列四種運算符皆在此使用第二種表達方式表示;

  資料測試運算符:使用雙目操作符進行運算;

  [ n1 -eq n2 ]:測試n1和n2是否相等,相等為真,不等為假

  [ n1 -ne n2 ]:測試n1和n2是否不相等,不等為真,相等為假;

  [ n1 -lt n2 ]:測試的n1和n2,左邊的是否小于右邊的,小于為真,大于為假;

  [ n1 -gt n2 ]:測試的n1和n2,左邊的是否大于右邊的,大于為真,小于為假;

  [ n1 -le n2 ]:測試的n1和n2,左邊的是否小于等于右邊的;

  例

  [root@localhost wjq]# [ "$a" -eq 0 ] && echo "a等于0" || echo "a不等于0"

  a不等于0

  字元串測試運算符:

  使用單目運算符進行操作;

  -z ‘n1’:如果字元串長度為0,則測試條件為真;

  -n ‘n1’:如果字元串長度不為0;非空為真,空為假;

  [root@localhost wjq]# a='string'

  [root@localhost wjq]# [ -z "$a" ] && echo "a等于0" || echo "a不等于0"

  使用雙目運算符進行操作:

  ==|=:被測試的兩個字元串是否相等,相同為真,不同為假;

  !=:被測試的兩個字元是否不相同,不同為真,相同為假;

  >:被測試的兩個字元串在轉化為ascll碼後的二進制資料;左邊是否大于右邊,大于為真,小于為      假;

  >:被測試的兩個字元串在轉化為ascll碼後的二進制資料,左邊是否小于右邊,小于為真,大于為      假;

  ①

  [root@localhost wjq]# b='string'

  [root@localhost wjq]# [ "$a" == "$b" ] && echo "a等于b" || echo "a不等于b"

  a等于b

  ②

  [root@localhost wjq]# b='str'

  [root@localhost wjq]# [ "$a" != "$b" ] && echo "a不等于b" || echo "a等于b"

  a不等于b

  ③

  [root@localhost wjq]# [ "$a" > "$b" ] && echo "a大于b" || echo "a小于b"

  a大于b

  檔案狀态測試運算符:單目測試運算符;

  檔案存在性測試,如果測試的檔案存在為真,不存在為假;

  -a|-e:

  [root@localhost wjq]# [ -a ./8yu ] && echo "檔案存在" || echo "檔案不存在"

  檔案存在

  檔案類型測試(測試存在性)

  -b file:若檔案存在并且為塊裝置,則測試為真;

  -c file:若檔案存在并且為字元裝置,則測試為真;

  -d file:若檔案存在并且為目錄裝置,則測試為真;

  -f file:若檔案存在并且為文本文檔,則測試為真;

  -h|-L file:若檔案為存在并且為符号連結檔案,則測試為真;

  -p file:若檔案存在并且為套接字檔案,則測試為真;

  [root@localhost wjq]# [ -f ./8yu ] && echo "檔案為文本文檔" || echo "檔案不是文本文檔"

  檔案為文本文檔

  檔案的通路權限設定:

  -r file:若檔案存在并且是使用者可讀,則測試為真;

  -w file:若檔案存在并且是使用者可寫,則測試為真;

  -x file:若檔案存在并且是使用者可執行的,則測試為真;

  [root@localhost wjq]# [ -r ./8yu ] && echo "檔案可讀" || echo "檔案不可讀"

  檔案可讀

  [root@localhost wjq]# [ -w ./8yu ] && echo "檔案可寫" || echo "檔案不可寫"

  檔案可寫

  [root@localhost wjq]# [ -x ./8yu ] && echo "檔案可執行" || echo "檔案不可執行"

  檔案可執行

  檔案特殊權限辨別測試:

  -u file:若檔案存在并且設定了SUID權限,則測試為真;否則為假;

  -g file:若檔案存在并且設定了SGID權限,則測試為真;否則為假;

  -k file:若檔案存在并且設定了sticky權限,則測試為真;否則為假;

  [root@localhost wjq]# [ -u ./8yu ] && echo "檔案存在SUID權限" || echo "檔案不存在SUID權   限"

  檔案不存在SUID權限

  [root@localhost wjq]# [ -g ./8yu ] && echo "檔案存在SGID權限" || echo "檔案不存在SGID權   限"

  檔案不存在SGID權限

  [root@localhost wjq]# [ -k ./8yu ] && echo "檔案存在STICKY權限" || echo "檔案不存在     STICKY權限"

  檔案所有權測試:

  -O file:若檔案存在并且其屬主為目前有效使用者,則測試為真;否則為假;

  -G file:若檔案存在并且其屬組是為目前有效使用者,則測試為真;否則為假;

  [root@localhost wjq]# [ -O ./8yu ] && echo "檔案存在且其屬主為當使用者" || echo "檔案不存   在"

  檔案不存在

  [root@localhost wjq]# ls ./8yu

  ./8yu

  [root@localhost wjq]# ls -l ./8yu

  -rwxrw-r--. 1 wjq wjq 71 3月  27 20:39 ./8yu

  檔案内容是否為空:

  -s file:若檔案存在并且内容不為空,存在且内容不為空則為真;否則為假;

  時間戳測試:

  -N file:被測試檔案自從上一次被修改之後,是否被修改過;

  邏輯測試運算符:

  ① !:邏輯非(NOT),他放在任何表達式前,是原來為真的表達式變為假,使原來為假的表達式變為真;

  ② -a:邏輯與(AND),他放在兩個邏輯表達式之間,僅當兩個都為真時,結果才為真;

  例:

  [ -f ./8yu -a -f ./aa ]

  ③ -o:邏輯或(OR),他放在兩個邏輯表達式中間,其中隻要有一個為真,結果才為真;

  [ -f ./8yu -o -f ./aa ]

  兩種表達式等價:

  第一種表達式:

  [ -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 ]

  [ ! -O /tmp/test ]

本文轉自 wujunqi1996 51CTO部落格,原文連結:http://blog.51cto.com/12480612/1917899

繼續閱讀