標籤:基礎知識 linux 運算式
在shell指令碼編程中算術運算無疑是十分重要的;
bash中執行整數算數運算的命令是let,其文法格式為:
let arg...
arg為單獨的算術運算式如+,-,*,/,%,^等所構成的完整的算術運算式;
其中^為平方運算,如2^3表示2的三次方;
let命令可以使用如下方式替代:
((算術運算式))
例如
[[email protected] wjq]# let "a=2*3"
[[email protected] wjq]# echo $a
6
[[email protected] wjq]# (("a=3*3"))
[[email protected] wjq]# echo $a
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命令運算為:
[[email protected] wjq]# b=5
[[email protected] wjq]# let "a+=b"
[[email protected] wjq]# echo $a
14
[[email protected] wjq]#
特殊增強型運算:
a++:a先將值賦給變數,再+1;
++a:a先+1,再將值賦給變數;
a--:a先將值賦給變數,再-1;
--a:a先-1,再將值賦給變數;
轉化為let命令的運算方式為:
[[email protected] wjq]# a=4
[[email protected] wjq]# b=5
[[email protected] wjq]# let "a++"
[[email protected] wjq]# let "a+=b"
[[email protected] wjq]# echo $a
10
算術運算方法:
① let VAR=算術運算式
#let “B=5+4”
#echo $B
將算術運算式先行進行算術運算,並將運算得到的結果儲存到變數VAR;
變數:儲存資料的容器
弱變數:弱類型變數,預設是字元型變數,數值型(不包括浮點型)
② VAR=$[算術運算式]
[[email protected] wjq]# a=$[a*b]
[[email protected] wjq]# echo $a
50
③ VAR=$((算術運算式))
算術運算式中如果有引用就用$引用,也可以省略
[[email protected] wjq]# a=$((a*b))
[[email protected] wjq]# echo $a
250
④ exper ARGU1 ARGU2 ARGU3
ARGU1和ARGU3 必須是數值
ARGU2是運算子
⑤ echo “算術運算式” | bc(bc命令相當於計算機)
[[email protected] 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,左邊的是否小於等於右邊的;
例
[[email protected] wjq]# [ "$a" -eq 0 ] && echo "a等於0" || echo "a不等於0"
a不等於0
字串測試運算子:
使用單目運算子進行操作;
-z ‘n1’:如果字串長度為0,則測試條件為真;
-n ‘n1’:如果字串長度不為0;非空為真,空為假;
[[email protected] wjq]# a=‘string‘
[[email protected] wjq]# [ -z "$a" ] && echo "a等於0" || echo "a不等於0"
a不等於0
使用雙目運算子進行操作:
==|=:被測試的兩個字串是否相等,相同為真,不同為假;
!=:被測試的兩個字元是否不相同,不同為真,相同為假;
>:被測試的兩個字串在轉化為ascll碼後的位元據;左邊是否大於右邊,大於為真,小於為 假;
>:被測試的兩個字串在轉化為ascll碼後的位元據,左邊是否小於右邊,小於為真,大於為 假;
例
①
[[email protected] wjq]# a=‘string‘
[[email protected] wjq]# b=‘string‘
[[email protected] wjq]# [ "$a" == "$b" ] && echo "a等於b" || echo "a不等於b"
a等於b
②
[[email protected] wjq]# a=‘string‘
[[email protected] wjq]# b=‘str‘
[[email protected] wjq]# [ "$a" != "$b" ] && echo "a不等於b" || echo "a等於b"
a不等於b
③
[[email protected] wjq]# a=‘string‘
[[email protected] wjq]# b=‘str‘
[[email protected] wjq]# [ "$a" > "$b" ] && echo "a大於b" || echo "a小於b"
a大於b
檔案狀態測試運算子:單目測試運算子;
檔案存在性測試,如果測試的檔案存在為真,不存在為假;
-a|-e:
例
[[email protected] wjq]# [ -a ./8yu ] && echo "檔案存在" || echo "檔案不存在"
檔案存在
檔案類型測試(測試存在性)
-b file:若檔案存在並且為塊裝置,則測試為真;
-c file:若檔案存在並且為字元裝置,則測試為真;
-d file:若檔案存在並且為目錄裝置,則測試為真;
-f file:若檔案存在並且為文字文件,則測試為真;
-h|-L file:若檔案為存在並且為符號連結檔案,則測試為真;
-p file:若檔案存在並且為通訊端檔案,則測試為真;
例
[[email protected] wjq]# [ -f ./8yu ] && echo "檔案為文字文件" || echo "檔案不是文字文件"
檔案為文字文件
檔案的存取權限設定:
-r file:若檔案存在並且是使用者可讀,則測試為真;
-w file:若檔案存在並且是使用者可寫,則測試為真;
-x file:若檔案存在並且是使用者可執行檔,則測試為真;
例
[[email protected] wjq]# [ -r ./8yu ] && echo "檔案可讀" || echo "檔案不可讀"
檔案可讀
[[email protected] wjq]# [ -w ./8yu ] && echo "檔案可寫" || echo "檔案不可寫"
檔案可寫
[[email protected] wjq]# [ -x ./8yu ] && echo "檔案可執行" || echo "檔案不可執行"
檔案可執行
檔案特殊許可權標識測試:
-u file:若檔案存在並且設定了SUID許可權,則測試為真;否則為假;
-g file:若檔案存在並且設定了SGID許可權,則測試為真;否則為假;
-k file:若檔案存在並且設定了sticky許可權,則測試為真;否則為假;
例
[[email protected] wjq]# [ -u ./8yu ] && echo "檔案存在SUID許可權" || echo "檔案不存在SUID權 限"
檔案不存在SUID許可權
[[email protected] wjq]# [ -g ./8yu ] && echo "檔案存在SGID許可權" || echo "檔案不存在SGID權 限"
檔案不存在SGID許可權
[[email protected] wjq]# [ -k ./8yu ] && echo "檔案存在STICKY許可權" || echo "檔案不存在 STICKY許可權"
檔案不存在SUID許可權
檔案所有權測試:
-O file:若檔案存在並且其屬主為當前有效使用者,則測試為真;否則為假;
-G file:若檔案存在並且其屬組是為當前有效使用者,則測試為真;否則為假;
例
[[email protected] wjq]# [ -O ./8yu ] && echo "檔案存在且其屬主為當使用者" || echo "檔案不存 在"
檔案不存在
[[email protected] wjq]# ls ./8yu
./8yu
[[email protected] 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 ]
Linux系統Bash(Shell)基礎知識(3)