標籤:shell指令碼 算術運算
shell指令碼編程實現算術運算有:
+、-
*、/
模運算 %
乘方 ** 或 ^
特殊的增強型算術運算:
++ --
算術運算方法
1.let命令 VAR=算術運算式
將算術運算式先行進行算術運算並將運算結果儲存到變數VAR中
2.VAR=$[算術運算式] []內如果引用變數,可以使用$ 也可以省略掉$
3.VAR=$((算術運算式)) 即把[]換成(())
4.expr ARG1 ARG2 ARG3
ARG1和ARG3必須是數值,ARG2必須是運算子
5.echo "算術運算式" | bc
注意:*在某些情況下需要轉義
例如:統計/etc/fstab /etc/passwd /etc/issue三個檔案中以字母r開頭的行數的總和
echo $[$(grep -c ‘^r‘ /etc/passwd)+$(grep -c ‘^r‘ /etc/passwd)]
條件測試命令:
1.test Expression
shell的內建命令
2.[ Expression ]
外部命令[ ;
3.[[ Expression ]]
bash的內部關鍵字;
注意 這類命令一般沒有執行結果,只有執行狀態傳回值;用於邏輯判斷;
test測試命令有三類測試運算式
1.數值測試:雙目操作符
-eq :被測試的兩個數值是否相等,相等為真,不等為假
-ne :被測試的兩個數值是否不等,不等為真,相等為假
-gt :被測試的兩個數值,左是否大於右,大於為真,不大於為假
-lt :被測試的兩個數值,左是否小於右,小於為真,不小於為假
-ge :被測試的兩個數值,左是否大於等於右,大於等於為真,小於為假
-le :被測試的兩個數值,左是否小於等於右,小於等於為真,大於為假
例子:~/aaa 的大小是否小於1000位元組
[ $(du a.c | awk ‘{print $1}‘) -lt 1000 ] && echo true || echo false
2.字串測試
分為雙目和單目
雙目操作符:
== :被測試的兩個字串是否相同,相同為真,不同為假
!= :被測試的兩個字串是否不相同,不同為真,相同為假
>: 被測試的兩個字串在ASCII碼錶中對應的位元值,左是否大於右,大於為真,小於為假
<: 被測試的兩個字串在ASCII碼錶中對應的位元值,左是否小於右,小於為真,大於為假
注意:> 和 < 必須用在[[ EXPR ]]的測試語句中
=~ :被測試的兩個字串,左能否被右的PATTERN匹配,能匹配為真,不能為假;、
單目操作符:
-z ‘STRING‘ : 判斷指定的字串是否為空白串,空為真,非空為假
-n ‘STRING‘ : 判斷指定的字串是否為非空串,非空為真,空為假
注意:
1.通常情況下,字串要加引號,根據實際情況選擇單還是雙引號
2.[[]]和[]在某些情況下,可能意義不同,要區分使用
3.運算式兩端以及操作符兩端都要有空格
3.檔案狀態測試
單目:
1、-a | -e :檔案的存在性測試:如果被測試的檔案存在為真,不存在為假
2、檔案類型測試(先測試了存在性)
-b FILE : 被測試的檔案是否存在並且是否為塊裝置;存在且為塊裝置為真,否則為假
-c FILE : 被測試的檔案是否存在並且是否為字元裝置;...
-d FILE : 被測試的檔案是否存在並且是否為目錄檔案;...
-f FILE : 被測試的檔案是否存在並且是否為普通檔案;...
-h|-L FILE :被測試的檔案是否存在並且是否為符號串連檔案;...
-p FILE : 被測試的檔案是否存在並且是否為管道檔案;...
-S FILE : 被測試的檔案是否存在並且是否為通訊端檔案...
3.檔案的存取權限測試
-r FILE:被測試的檔案是否存在並且當前有效使用者是否可讀,檔案存在且當前有效使用者可讀為真,否則為假;
-w FILE:被測試的檔案是否存在並且當前有效使用者是否可寫,檔案存在且當前有效使用者可寫為真,否則為假;
-x FILE:被測試的檔案是否存在並且當前有效使用者是否可執行,檔案存在且當前有效使用者可執行為真,否則為假;
4.檔案的特殊許可權標識測試:
-u FILE:被測試的檔案是否存在並且是否設定了SUID許可權,檔案存在且設定了SUID為真,否則為假;
-g FILE:被測試的檔案是否存在並且是否設定了SGID許可權,檔案存在且設定了SGID為真,否則為假;
-k FILE:被測試的檔案是否存在並且是否設定了STICKY許可權,檔案存在且設定了STICKY為真,否則為假;
5.檔案的所有權測試:
-O FILE:被測試的檔案是否存在並且其屬主是否為當前有效使用者,檔案存在且屬主為目前使用者為真,否則為假;
-G FIle:被測試的檔案是否存在並且其屬組是否為當前有效使用者的組,檔案存在且屬組為目前使用者的組為真,否則為假;
6.檔案內容是否為空白
-s FILE:被測試的檔案是否存在並且內容不空,檔案存在且內容不空為真,否則為假;
7.時間戳記測試:
-N FILE:被測試的檔案自從上一次被修改之後,是否被修改過,修改過為真,否則為假
雙目:
FILE1 -nt FILE2 True if file1 is newer than file2 (according to modification date).
FILE1 -ot FILE2 True if file1 is older than file2.
FILE1 -ef FILE2 True if file1 is a hard link to file2.
測試語句中可以添加邏輯運算
第一種表達方式
例如[ -O /tmp/test ] && [ -s /tmp/test ] : 判斷/tmp/test 是否為當前有效使用者所有且不為空白
第二種
[ -O /tmp/test -a -s /tmp/test ] 在這裡 -a 表示 &&
[ -O /tmp/test -o -s /tmp/test ] 在這裡 -o 表示 ||
[ ! -O /tmp/test ] 與 ! [ -O /tmp/test ] 結果相同,但!含義不同;也可以寫作
命令的執行結果
正常的輸出結果
命令的執行狀態傳回值
0-255
0:成功
1,2,127:系統保留的
3-126 128-255 :使用者自訂的傳回值
exit [*]
退出當前shell的登入
當shell指令碼運行時,一旦遇到exit命令,將立即結束當前shell進程,同時指令碼的運行也將被停止,即exit後面的所有命令都不會再被執行
shell指令碼中的算術運算和條件測試語句