《跟老男孩學Linux運維之shell編程實戰》-第四章 變量的數值計算

本文講解shell編程中變量的數值計算。

1.常見的算術運算符:

wKiom1j4RnrydWFJAABg6oBovMQ759.png

提示:

此處對於我自己來說++、--比較難理解,之前一看到腳本中有這些符號,就看不懂了,所以在此舉例說明一下:

[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的值。

常見的算術運算命令:

wKioL1j4Rq7D2OJXAABXt-afQYw384.png

(1)雙小括號"(())"數值運算命令

雙小括號"(())"數值運算的基礎語法

雙小括號"(())"的作用是進行數值運算與數值比較,效率很高,用法靈活,是企業場景運維人員經常採用的運算操作符。

操作方法見下表:

wKioL1j4SeeDitArAABhAdKw-K8876.png

提示:

(())進行比較操作時,如果"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編程實戰》這本書時的筆記,如有任何版權問題,請聯繫留言。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章