若是要執行算術運算,就會離不開各類運算符號,和其餘編程語言相似,Shell也有不少算術運算符。shell
常見的運算符號,如圖:
常見的運算命令,如圖:
下面詳細介紹一下,各類運算命令的詳細用法:編程
雙小括號「(())」的做用是進行數值運算與數值比較,它的效率很高,用法靈活,是企業場景中運維人員常常採用的運算操做符,具體操做語法,如圖:
詳細介紹其使用方法:vim
進行簡單的運算,以下:bash
[root@localhost ~]# echo $((1+1)) 2 //計算1+1的結果再輸入 [root@localhost ~]# ((i=5)) [root@localhost ~]# ((i=i*2)) [root@localhost ~]# echo $i 10 //首先定義i的值,其次進行運算,最後輸出結果
稍微複雜一些的綜合運算,以下:運維
[root@localhost ~]# ((a=1+2**3-4%3)) && echo $a 8 //「**」表示幾回方的意思,「%」表示取餘的意思 //計算順序就是先乘除再加減, //最後經過echo輸出結果
特殊符號運算示例:編程語言
[root@localhost ~]# a=1 [root@localhost ~]# echo $((a=a+1)) 2 //將「a+1」從新賦值給a,而後輸出結果 [root@localhost ~]# echo $((a+=1)) 3 //「+=」表示「a=a+1」,從新複製給a [root@localhost ~]# echo $((a**2)) 9 //「**」表示冪次方,如今a的值是3,平方固然是9
利用「(())」雙括號進行比較及判斷示例:ide
[root@localhost ~]# echo $((1<2)) 1 //1表示結果的成立的,相反,0則表示結果不成立 [root@localhost ~]# echo $((2<1)) 0
上面示例中所涉及到的數字及變量必須爲整數,不能是小數點及字符串。函數
特殊符號「++」、「--」所表示的含義:工具
[root@localhost ~]# a=10 [root@localhost ~]# echo $((a++)) 10 [root@localhost ~]# echo $a 11 [root@localhost ~]# echo $((a--)) 11 [root@localhost ~]# echo $a 10 [root@localhost ~]# echo $((--a)) 9 [root@localhost ~]# echo $a 9 [root@localhost ~]# echo $((++a)) 10 [root@localhost ~]# echo $a 10
經過示例能夠看出:執行echo$((a++))和echo$((a--))命令輸出整個表達式時,輸出的值即爲a的值,表達式執行完畢後,會對a進行++、--的運算,而執行echo$((++a))和echo$((--a))命令輸出整個表達式時,會先對a進行++、--的運算,而後再輸出表達式的值,即爲a運算後的值。命令行
「(())」表達式在命令行執行時不須要加$符號,直接使用((6%2))形式便可,可是若是須要輸出,就要加$符,例如:echo$((6%2))。
·「(())」裏的全部字符之間沒有空格、有一個或多個空格都不會影響結果。
shell腳本小示例:
簡單的複雜運算的腳本
第一種,不太實用:
[root@bogon ~]# vim test.sh #!/bin/bash a=6 b=2 echo "$a-$b=$(($a-$b))" echo "$a+$b=$(($a+$b))" echo "$a*$b=$(($a*$b))" echo "$a/$b=$(($a/$b))" echo "$a**$b=$(($a**$b))" echo "$a%$b=$(($a%$b))" [root@bogon ~]# sh test.sh 6-2=4 6+2=8 6*2=12 6/2=3 6**2=36 6%2=0
第二種,實用:
[root@bogon ~]# vim test1.sh #!/bin/bash echo "$1-$2=$(($1-$2))" echo "$1+$2=$(($1+$2))" echo "$1*$2=$(($1*$2))" echo "$1/$2=$(($1/$2))" echo "$1**$2=$(($1**$2))" echo "$1%$2=$(($1%$2))" [root@bogon ~]# sh test1.sh 10 2 10-2=8 10+2=12 10*2=20 10/2=5 10**2=100 10%2=0
使用read命令等待輸入,
第一種方法:
[root@bogon ~]# vim test2.sh #!/bin/bash print_usage(){ #定義一個整數 printf "Please enter an integer\n" #打印信息「請輸入一個整數」 exit 1 #返回值爲1,退出腳本 } read -p "Please input first number:" A #請輸入第一個數字 if [ -n "`echo ${A}|sed 's/[0-9]//g'`" ] #判斷是否爲整數,用0-9替換$A的值,進而判斷是否爲數字 then print_usage #若是上述變量值不爲空,說明不是整數,則調用用戶幫助函數 fi read -p "Please input the operators:" B #請輸入操做符 if [ "${B}" != "+" ] && [ "${B}" != "-" ] && [ "${B}" != "*" ] && [ "${B}" != "/" ] && [ "${B}" != "%" ] && [ "${B}" != "**" ] #判斷輸入的內容是否爲+、-、*、/、%、** then echo "Please use{+|-|*|/|%|**}" #若是操做符不符合要求,則給出提示 exit 2 #由於不符合要求,所以以返回值爲2退出腳本,表示錯誤 fi read -p "Please input second number: " C #請輸入第二個數字 if [ -n "`echo ${C}|sed 's/[0-9]//g'`" ] #判斷是否爲整數,用0-9替換$C的值,進而判斷是否爲數字 then print_usage #若是上述變量值不爲空,說明不是整數,則調用用戶幫助函數 fi echo "${A}${B}${C}=$((${A}${B}${C}))" #最後輸出結果 [root@bogon ~]# sh test2.sh Please input first number:10 Please input the operators:/ Please input second number: 2 10/2=5
第二種:
[root@bogon ~]# vim test3.sh #!/bin/bash print_usage(){ printf $"USAGE:$0 NUM1 {+|-|*|/} NUM2\n" #打印幫助信息 exit 1 } if [ $# -ne 3 ] #若是腳本傳入的參數個數不等於3個(由於要輸入兩個數字及一個運算符號)。 then print_usage #則調用用戶幫助函數。 fi A=$1 C=$3 B=$2 if [ -n "`echo ${A}|sed 's/[0-9]//g'`" ] then print_usage fi if [ "${B}" != "+" ] && [ "${B}" != "-" ] && [ "${B}" != "*" ] && [ "${B}" != "/" ] #判斷第二個輸入的操做符是否爲+、-、*、/ then print_usage fi if [ -n "`echo ${C}|sed 's/[0-9]//g'`" ] then print_usage fi echo "${A}${B}${C}=$((${A}${B}${C}))" [root@bogon ~]# sh test3.sh 10 + 2 10+2=12 [root@bogon ~]# sh test3.sh 10 - 2 10-2=8 [root@bogon ~]# sh test3.sh 10 \* 2 10*2=20 [root@bogon ~]# sh test3.sh 10 / 2 10/2=5
最簡單、高效的一種辦法就是:
[root@bogon ~]# cat test4.sh echo $(($1)) //利用兩個雙括號計算 [root@bogon ~]# sh test4.sh 5+5 10 [root@bogon ~]# sh test4.sh "5 + 5" 10 //若是帶空格使用雙引號
let賦值表達式的功能等同於「((賦值表達式))」
好比:
[root@bogon ~]# i=2 [root@bogon ~]# i=i+8 [root@bogon ~]# echo $i i+8 //開頭不用let,輸出時並不會輸出計算結果 [root@bogon ~]# unset i [root@bogon ~]# i=2 [root@bogon ~]# let i=i+8 [root@bogon ~]# echo $i 10 //使用let開頭,輸出是則會輸出計算結果 [root@bogon ~]# ((i=i+10)) [root@bogon ~]# echo $i 20
let i=i+8與((i=i+8))效果同樣,推薦使用第二種!
expr命令既能夠用於整數運算,也可用於相關字符串長度、匹配等的運算處理!
[root@bogon ~]# expr 2 + 2 4 [root@bogon ~]# expr 2 - 2 0 [root@bogon ~]# expr 2 \* 2 4 //須要使用轉義符「\」 [root@bogon ~]# expr 2 / 2 1
在使用expr命令時:
- 運算符及用於就算的數字左右都至少有一個空格,不然會報錯;
- 使用星號時,必須使用轉義符「\」,不然shell會錯誤的理解星號的做用;
expr可配合變量進行計算,但須要用反引號將計算表達式括起來。好比:
[root@bogon ~]# i=5 [root@bogon ~]# i=`expr $i + 5` //注意變量和數字兩邊要有空格 [root@bogon ~]# echo $i 10
原理:利用以expr作計算時變量或字符串必須是整數的原則,把一個變量或字符串和一個已知的整數(非0)相加,看命令執行的結果是否爲0。若是是0,就認爲作加法的變量或字符串爲整數;反之則不是。好比:
[root@bogon ~]# i=5 [root@bogon ~]# expr $i + 6 &>/dev/null [root@bogon ~]# echo $? 0 [root@bogon ~]# i=a [root@bogon ~]# expr $i + 6 &>/dev/null [root@bogon ~]# echo $? 2
腳本示例:
第一種:
[root@bogon ~]# vim test.sh #!/bin/bash expr $1 + 1 &> /dev/null if [ $? -eq 0 ] then echo int else echo chars fi [root@bogon ~]# sh -x test.sh 12 + expr 12 + 1 + '[' 0 -eq 0 ']' + echo int int [root@bogon ~]# sh -x test.sh qq + expr qq + 1 + '[' 2 -eq 0 ']' + echo chars chars
第二種
[root@bogon ~]# vim test1.sh #!/bin/bash while true do read -p "Please input:" A expr $A + 1 &>/dev/null if [ $? -eq 0 ] then echo int else echo chars fi done [root@bogon ~]# sh test1.sh Please input:1 int Please input:q chars //這樣的腳本是永遠等待輸入,並判斷; //若是隻但願判斷一次就結束,把while循環語句刪除便可!
[root@bogon ~]# a=dfdfdfdfdfd [root@bogon ~]# expr length "$a" 11 [root@bogon ~]# echo ${#a} 11 [root@bogon ~]# echo ${a} | wc -L 11 [root@bogon ~]# echo ${a} | awk '{print length($0)}' 11
bc是Linux下的計算機,除了能夠做爲計算機來使用,還能夠做爲命令工具來使用!
bc命令做爲計算機使用:
[root@bogon ~]# 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'. 1+2 3
bc命令在命令行進行計算:
[root@bogon ~]# echo 3+5 | bc 8 [root@bogon ~]# echo "scale=2;355/113"|bc 3.14 //使用scale=2保留兩位小數。
利用awk進行運算的效果也很好,適合小數和整數,特別是命令行計算,尤爲是小數,運算很精確,好用。好比:
[root@bogon ~]# echo "1.2 1.3" | awk '{print $1+$2}' 2.5 [root@bogon ~]# echo "10 10" | awk '{print ($1+10)/$2}' 2
示例:
[root@bogon ~]# i=10 [root@bogon ~]# i=$[i+10] && echo $i 20 [root@bogon ~]# echo $[2*3] 6 [root@bogon ~]# echo $[2-3] -1
此次就簡單介紹這麼多!
———————— 本文至此結束,感謝閱讀 ————————