在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