本文講解shell編程中變量的數值計算。
1.常見的算術運算符:
提示:
此處對於我自己來說++、--比較難理解,之前一看到腳本中有這些符號,就看不懂了,所以在此舉例說明一下:
[root@www ~]# a=10 ==>定義變量a
[root@www ~]# echo $((a++))
==>如果a在運算符++或--的前面,那麼輸出整個表達式時,會輸出a的值, 此前定義的變量a爲10,所以此處的值爲10.
10
[root@www ~]# echo $a ==>執行上述表達式後,因爲有a++,因此a會自增1,所以輸出的值爲11
11
[root@www ~]# a=11 ==>定義變量a
[root@www ~]# echo $((a--))
==>如果a在運算符++或--的前面,那麼輸出整個表達式時,會輸出a的值,前定義的a爲11,所以此處的值爲11.
11
[root@www ~]# echo $a ==>執行上述表達式後,因爲有a--,因此a會自減1,所以輸出的值爲10
10
[root@www ~]# a=10
[root@www ~]# echo $((--a))
==>如果a在運算符++或--的後面,那麼輸出整個表達式時,先進行自增或自減計算,因爲a爲10, 且要自減,所以表達式的值爲9.
9
[root@www ~]# echo $a ==>執行上述表達式後,a自減1,所以表達式的值爲9.
9
[root@www ~]# echo $((++a))
==>如果a在運算符++或--的後面,那麼輸出整個表達式時,先進行自增或自減計算,因爲a爲9,且要自增1,所以表達式的值爲10
10
[root@www ~]# echo $a ==>執行上述表達式後,a自增1,所以表達式的值爲10
10
總結:
執行echo $((a++))和echo $((a--))命令輸出整個表達式時,輸出的值爲a的值,表達式執行完畢後,會對a進行++、--的運算,而執行
echo $((++a))和echo $(--a)命令輸出整個表達式時,會先對a進行++、--的運算,然後再輸出表達式的值,即爲a運算後的值。
記憶口訣:
變量a在運算符之前,輸出表達式的值爲a,然後a自增或自減;
變量a在運算符之後,輸出的表達式會先進行自增或自減,表達式的值就是自增或自減後a的值。
常見的算術運算命令:
(1)雙小括號"(())"數值運算命令
雙小括號"(())"數值運算的基礎語法
雙小括號"(())"的作用是進行數值運算與數值比較,效率很高,用法靈活,是企業場景運維人員經常採用的運算操作符。
操作方法見下表:
提示:
(())進行比較操作時,如果"echo $((2>1))"返回結果爲1則表示真,如果返回結果爲0,則表示假。
“(())”表達式在命令行執行時不需要加$符號,直接使用((2+3))形式即可,但是如果需要輸出,就要加$
符號,如:echo $((2+3))。
"(())"裏的所有的字符之間沒有空格,有一個或多個空格都不會影響結果。
(2)let運算命令的用法
let運算命令的語法格式:let 賦值表達式
let賦值表達式的功能等同於“((賦值表達式))”
let賦值:舉例:let i=i+2 ==>等同於((i=i+2))
(3)expr命令的用法
expr命令的基本用法:
expr既可以用於整數運算,也可以用於相關字符串長度、匹配等的運算處理。
應用1:expr用於計算
語法:expr Expression ==>expression中可包含變量
例如:
[root@www ~]# expr 1 + 1
2
[root@www ~]# expr 1 \* 1
1
注意:在使用expr時,要注意以下2點:
運算符及用於計算的數字左右都至少有一個空格,否則會報錯。
使用乘號時,必須用反斜線進行轉義。
應用2:判斷一個變量值或字符串是否爲整數
此應用利用以expr做計算時變量或字符創必須爲整數的規則,把一個變量或字符串和一個已知的整數(非0)相加,
看返回的值是否爲0,如果爲0,就認爲做加法的變量或字符串爲整數,否則就不是整數。
另外,expr match功能也可以進行整數判斷,格式如下:
expr match $string substring
在$string字符串中匹配substring字符串,然後返回匹配到的substring字符串的長度,若找不到,則返回0。
應用3:expr判斷文件擴展名是否符合要求:
舉例說明:
判斷是否是以.pub爲擴展名:
[root@www scripts]# cat expr.sh
#!/bin/sh
if expr "$1" : ".*\.pub" &>/dev/null ==>注意:在此冒號前後要有空格
then
echo "you are using $1"
else
echo "pls use *.pub file"
fi
[root@www scripts]# sh expr.sh qq.pub
you are using qq.pub
[root@www scripts]# sh expr.sh qq
pls use *.pub file
應用4:通過expr計算字符串的長度
語法:expr length $變量名或字符串
(4)bc命令的用法
bc是Linux下的計算器,當然除了作爲計算器使用,還可以作爲命令行計算工具使用。
使用方法如下:
[root@www scripts]# bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
2+3
5
3*3
9
[root@www scripts]# echo 2+3|bc
5
[root@www scripts]# echo "scale=2;9/2" | bc ==>使用scale=2保留2位小數
4.50
[root@www scripts]# echo "scale=2;355/113" | bc
3.14
(5)awk實現計算
利用awk運算的效果也很好,適合小數和整數,尤其是小數,運算很精確。
示例如下:
[root@www ~]# echo "5 6" | awk '{print ($1+$2)}'
==>$1爲第1個數字,$2爲第2個數字,用空格分開 ,注意awk '{ }'的單引號
11
[root@www ~]# echo "5.5 6.6" | awk '{print ($1+$2)}'
12.1
(6)declare(同typeset)命令的語法
declare與typeset命令是bash的內置命令,二者命令的語法相同,用來聲明shell變量,設置變量的屬性。
常用命令參數:
-r:設置變量爲只讀
-i:設置變量爲整數
-a:設置變量爲數組array
-f:如果後面沒有參數的話,會列出之前腳本定義的所有函數,如果有參數的話,列出以參數命名的函數
-x:設置變量在腳本外也可以使用
簡單使用如下:
[root@www ~]# declare -i A=1 B=2
[root@www ~]# A=A+B
[root@www ~]# echo $A
3
(7)$[ ]符號的運算示例
[root@www ~]# echo $[1+2]
3
[root@www ~]# echo $[1*2]
2
(8)基於shell變量輸入read命令的運算實踐
shell腳本除了可以直接賦值或腳本傳參外,還可以使用read命令從標準輸入中獲得,read爲bash的
內置命令,而已通過help read查看幫助。
語法格式:read [參數] [變量名]
常用參數:
-p(prompt):設置提示信息
-t(timeout):設置輸入等待時間,單位默認爲秒。
[root@www ~]# read -t 5 -p "Pls input one num:" num
==>此處的num爲變量名,注意此處不需要加$符號,下面a、b同理。
Pls input one num:2
[root@www ~]# read -t 5 -p "Pls input two num:" a b
Pls input two num:1 2
以上爲本人在讀《跟老男孩學Linux運維之shell編程實戰》這本書時的筆記,如有任何版權問題,請聯繫留言。