亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Linux Shell > 正文

詳解Shell編程之變量數值計算(一)

2020-07-27 18:49:14
字體:
來源:轉載
供稿:網友

如果要執行運算,那就少不了運算符,和其他的編程語言相似,shell也有很多的運算符如下:

+、-、:代表著加號 和減號 或者,負號

*、/、%:代表著乘號,除號,和取模。

**   : 冪運算

++、-- :表示著增加或者減少,它可以放在前置,也可以放在變量的結尾

!、||、&&、(取反)(或) (and)

<、<=、>、>=  :比較符號,小于、小于等于、大于、大于等于

==、!=、= :相等,不相等, =表示相等于

<<     >>  向左移動 向右移動

等等,這里就不說了 到后面實踐中再見!

Shell編程之算術運算命令

(())  用于整數之間常用的運算符,效率高

let :用于整數運算,類似于(())

expr :用于整數運算,但是還有其他功能

bc :Linux下的一個計算程序,適合整數及小數運算

$[] :用于整數運算

awk:awk既可以整數運算,也可以小數運算

declare: 定義變量值和屬性,-i參數可以用于定義整形變量,做運算

第一眼看到這些 感覺很復雜,心亂,但是沒有關系,慢慢的就好了~~~

一、雙小括號(()) 數值運算命令

雙小括號的作用是進行數值運算與數值的比較,它的效率很高,用法很靈活,是企業運維人員經常采用的操作符
((e=e+1)) 它的作用就是把e+1的結果賦值給變量e但是不可以用 echo ((e=e+1))來使用,但可以使用echo $((e=e+1))
e=$((e=e+1)) 作用就是把e+1的執行結果賦值給變量e

數值比較

((8>7&&5==5)) 用于數值之前的比較,用于條件判斷

echo $((2+1)) 用于直接輸出運算表達式的結果,在(()) 前面加$符號

案例1:雙小括號"(())"數值運算實踐

[root@shell-yankerp sh]# echo $((1+1)) #計算1+1后輸出 2  #那么結果就是等于2 [root@shell-yankerp sh]# 

以此類推使用減號

[root@shell-yankerp sh]# echo $((6-3)) #計算6-3等于多少 3  #結果為3 [root@shell-yankerp sh]# 

是不是感覺有點簡單。那么接下來利用"(())"進行稍微復雜的一些綜合算術運算

[root@shell-yankerp sh]# ((a=1+2**3-4%3)) 

以上例子也就是說,首先a是一個變量名,那么在a=后面的一些計算的結果會賦值給a這個變量,那么首先我們得知道后面的計算結果是多少,在這個變量中 我們用到了+號"**"以及"-"號包括“%”首先計算過程是這樣的。先算乘除,后算加減

2**3 等于 2x2x2=8 乘算出來之后算除。 4%3=1 取模---- 8-1=7 最后1+7=8 最后結果為8 輸出如下:

例如2:

[root@shell-yankerp sh]# b=$((1+2**3-4%3)) #在這里b是一個變量 將變量名的計算結果賦值給b [root@shell-yankerp sh]# echo $b     #輸出如下: 8 [root@shell-yankerp sh]# 

其實例1 和2都是差不多的 只不過是用了不同的方法?。。?/p>

例3:特殊運算符號的運算實例

[root@shell-yankerp sh]# a=8    #首先a變量名 = 變量值 等于8 那么a就是8 [root@shell-yankerp sh]# echo $((a=a+2)) #原來a=8 那么現在a+2 結果為10 10 [root@shell-yankerp sh]# echo $((a+=1))  #當結果為10 這一行代表 a=a+1那么就等于11 11 [root@shell-yankerp sh]# echo $((a**2))  #目前a=11 那么a**2 a的二次方 那么等于11x11=121 輸出如下: 121 [root@shell-yankerp sh]# 

例4:利用(())雙括號,進行比較判斷

[root@shell-yankerp sh]# echo $((2>1)) #當條件2>1正確后輸出了1表示真 1 [root@shell-yankerp sh]# echo $((2>3)) #當條件2>3錯誤后輸出0 0 [root@shell-yankerp sh]# echo $((6==6)) #6==6 那么就輸出1 1 [root@shell-yankerp sh]#  

if 判斷小實戰

在以上的圖中不用想肯定是輸出條件成立繼續運行了因為8本來就大于5;7本來就等于7 輸出如下:

我們嘗試的改下腳本如下:

在上圖中8等于5肯定是錯誤的 那么輸出如下:

上面涉及到了數字及變量必須為整數,不能是小數... 但是可以用bc來解決后面會說到。

案例:在變量前后使用++、--、特殊運算符的表達式

首先我們需要知道++是什么意思

++、-- :表示著增加或者減少,它可以放在前置,也可以放在變量的結尾

[root@shell-yankerp sh]# a=10 [root@shell-yankerp sh]# echo $((a++)) 10 [root@shell-yankerp sh]# echo $a 11 [root@shell-yankerp sh]# 

以上內容中的a=10 那么a是變量名 變量值等于10 那么echo $((a++)) ++的意思上面已經說過了,輸出結果為10 因為++在a的后面 所以先輸出a的值為10 那么繼續echo $a 那么就變成11 因為a++后面增加1

例2:

[root@shell-yankerp sh]# a=11 [root@shell-yankerp sh]# echo $((a--)) 11 [root@shell-yankerp sh]# echo $a 10 [root@shell-yankerp sh]# 

以上就是--的用法了。這里不在說了

在以下的案例中我相信的大家肯定知道了在前面加++ 和在后面加++的區別了 如下:

[root@shell-yankerp sh]# echo $a 10 [root@shell-yankerp sh]# echo $((--a)) 9 [root@shell-yankerp sh]# a=9 [root@shell-yankerp sh]# echo $a 9 [root@shell-yankerp sh]# echo $((++a)) 10 [root@shell-yankerp sh]# 

例:通過(())運算后賦值給變量

[root@shell-yankerp sh]# yankerp=99 [root@shell-yankerp sh]# echo $((yankerp+1)) 100 [root@shell-yankerp sh]# echo $(( yankerp+1 )) 100 [root@shell-yankerp sh]# 

在以上的案例中,有空格和沒空格都是一樣的。

包含(())各種常見的運算符命令執行如下:

[root@shell-yankerp sh]# echo $((3+2)) 5 [root@shell-yankerp sh]# echo $((3-2)) 1 [root@shell-yankerp sh]# echo $((3**2)) 9 [root@shell-yankerp sh]# echo $((3*2))  6 [root@shell-yankerp sh]# echo $((3/2)) 1 [root@shell-yankerp sh]# echo $((3%2)) 1 [root@shell-yankerp sh]# 

各種(())運算的shell腳本案例

#!/bin/bash # DATE:Wed Jan 31 19:49:59 CST 2018 # This is a yankerp!  a=6 b=3 echo "a-b=$((a-b))" echo "a+b=$((a+b))" echo "a/b=$((a/b))" echo "a**b=$((a**b))" 

輸出結果為如下:

[root@shell-yankerp sh]# sh test.sh  
a-b=3 
a+b=9 
a/b=2 
a**b=216 
[root@shell-yankerp sh]#  

特殊位置變量+數值運算實戰案例如下:

#!/bin/bash # DATE:Wed Jan 31 19:49:59 CST 2018 # This is a yankerp!  a=$1 b=$2 echo "a-b=$((a-b))" echo "a+b=$((a+b))" echo "a**b=$((a**b))" echo "a/b=$((a/b)) 

在以上的腳本中 我們定義了特殊的位置變量 下面定義了數值運算,那么這個腳本的功能是,當我們輸入兩個字符,其中第一個字符賦值給了變量a 第二個字符賦值給了變量b 那么在下面進行數值運算,如果此腳本看不懂的大家可以參考我這篇文章http://www.49028c.com/article/134246.htm

運行結果如下:

[root@shell-yankerp sh]# sh test.sh 6 3 
a-b=3 
a+b=9 
a**b=216 
a/b=2 
[root@shell-yankerp sh]#  

這也就是特殊位置變量+本章的變量數值運算的結合

let運算命令的用法

例如

[root@shell-yankerp ~]# a=2   [root@shell-yankerp ~]# a=a+8  #沒有用let [root@shell-yankerp ~]# echo $a a+8  #輸出結果 [root@shell-yankerp ~]# unset a #清除變量  [root@shell-yankerp ~]# a=2 [root@shell-yankerp ~]# let a=a+8 使用let [root@shell-yankerp ~]# echo $a 10 [root@shell-yankerp ~]# 

其實還可以這么實現,如下:

[root@shell-yankerp ~]# a=2 [root@shell-yankerp ~]# echo $((a=a+8)) 10 [root@shell-yankerp ~]# echo $a 10 [root@shell-yankerp ~]# unset a [root@shell-yankerp ~]# a=2 [root@shell-yankerp ~]# let a=a+8 [root@shell-yankerp ~]# echo $a 10 [root@shell-yankerp ~]#  

兩者區別?。?!如上

expr命令用法實例:

[root@shell-yankerp sh]# expr 2 + 2 4 [root@shell-yankerp sh]# expr 4 - 2 2 [root@shell-yankerp sh]# expr 4 /* 2 8 [root@shell-yankerp sh]# expr 4 / 2  2 [root@shell-yankerp sh]#  

當我們選擇用*號需要拿/轉義、需要注意在用expr命令時 左右兩側必須要空格

2、expr配合變量實例

[root@shell-yankerp sh]# a=10 [root@shell-yankerp sh]# a=`expr $a + 10` [root@shell-yankerp sh]# echo $a 20 [root@shell-yankerp sh]# 

expr的企業級實戰案例:

[root@shell-yankerp sh]# i=5  #這里設置了一個變量 i=5 [root@shell-yankerp sh]# expr $i + 6 &>/dev/null  #那么我們使用expr命令 $i + 6 這里的6是一個整數 [root@shell-yankerp sh]# echo $?  #執行完成后我們使用特殊變量 $?來判斷以上命令 0     ---返回結果為0 [root@shell-yankerp sh]# expr $i + zhangsan &>/dev/null #同時這里又設置了一個變量 在這里的zhangsan是字符串 [root@shell-yankerp sh]# echo $?    #使用特殊變量判斷 2   #結果為2  [root@shell-yankerp sh]#  

利用expr做計算,將一個未知的變量和一個已知的一個整數相加,看返回的值是否為0,如果默認是0 那么就是一個整數。如果非0則輸入的就是字符串不是整數。

例:通過參數判斷輸出內容是否為整數

#!/bin/bash expr $1 + 1 &>/dev/null  #這里是一個命令 使用了expr 也使用了特殊的位置變量 if [ "$?" -eq 0 ]     #如果以上命令執行結果為0   then      #那么   echo "輸入的是整數~"  #輸出一條 輸入的是整數  else   #否則   echo "/bin/sh $# 請輸入一個整數"   這里也使用了特殊的位置變量 fi 

運行腳本測試

[root@shell-yankerp sh]# cat aaa.sh  #!/bin/bash expr $1 + 1 &>/dev/null if [ "$?" -eq 0 ]  then   echo "輸入的是整數~"  else   echo "/bin/sh $0 請輸入一個整數" fi [root@shell-yankerp sh]# sh aaa.sh 123 輸入的是整數~ [root@shell-yankerp sh]# sh aaa.sh zhangsan lisi /bin/sh aaa.sh 請輸入一個整數 [root@shell-yankerp sh]# 

實戰:第一關判斷參數個數是否為2.若不是請給出提示
          第二關判斷參數是否為整數,如果不是那么繼續給出提示
          第三關做運算~~~

#!/bin/bash if [ "$#" -ne "2" ]  then   echo "/bin/bash $0 請輸出兩個數值..."   exit 1 fi #no.2 a=$1 b=$2 expr $1 + 1 &>/dev/null if [ "$?" -ne "0" ]  then   echo "請輸入數值..."   exit 1 fi #no.3 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))" 

剖析:在以上腳本中其實很簡單,第一if 如果輸入的不是兩個傳參值,那么給出提示 這是第一段if條件語句,如果輸入的是兩個數值,那么繼續執行下面的條件,在第二個條件使用了位置參數變量$1 使用了expr命令來判斷用戶輸入的是數字還是字符串,當用戶輸入的是數字那么就是返回是成功的 那么我們使用了if語句 如果上面命令執行成功 如果不等于0 那么給出相應的提示,最后前面的兩個條件成立,那么接下來進行算法,這個前面是說過的。

執行腳本如下:

好了 本次就到這里,希望閱讀者快快吸收~~~ 后續不斷更新 謝謝大家,也希望大家多多支持武林網。

聲明:以上文章是<<跟著老男孩學Linux運維Shell編程實戰>>第五章;一部分看完的總結!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人在线观看视频网站| 亚洲最新视频在线| 欧美高清视频在线| 国产专区精品视频| 欧美日韩亚洲视频| 538国产精品一区二区免费视频| 97av在线视频| 精品国产成人在线| 18一19gay欧美视频网站| 国产精品视频内| 国产成人在线亚洲欧美| 91最新国产视频| 亚洲一区二区三区777| 97成人精品区在线播放| 热久久美女精品天天吊色| 欧美肥老太性生活视频| 久久久久久成人| 国产精品久久一区主播| 国产精品流白浆视频| 91欧美精品午夜性色福利在线| 欧美精品video| 久久不射热爱视频精品| 日韩在线国产精品| 国产精品一区二区久久久| 国产视频福利一区| 国产主播精品在线| 欧美大片大片在线播放| 欧美专区中文字幕| 992tv在线成人免费观看| 精品国内自产拍在线观看| 亚洲国产精品va在线看黑人动漫| 欧美日韩国产一区中文午夜| 国产亚洲精品综合一区91| 国产亚洲视频在线观看| 国产成人拍精品视频午夜网站| 国产精品视频xxx| 精品香蕉在线观看视频一| 日韩欧美一区二区三区| 色七七影院综合| 91香蕉国产在线观看| 亚洲欧洲在线观看| 亚洲福利视频网站| 国产98色在线| 国产精品99久久久久久久久久久久| 久久久久日韩精品久久久男男| 国产精品白丝av嫩草影院| 欧美性69xxxx肥| 久久久极品av| 91最新在线免费观看| 亚洲视频在线观看网站| 国产精品美女www爽爽爽视频| 都市激情亚洲色图| 国产精品自产拍高潮在线观看| 激情懂色av一区av二区av| 日韩中文字幕久久| 精品久久久久久| 欧美大成色www永久网站婷| 日韩av影视在线| 欧美高清不卡在线| 日韩视频免费大全中文字幕| 浅井舞香一区二区| 国产精品久久久久久av福利软件| 69**夜色精品国产69乱| 2018国产精品视频| 日本欧美在线视频| 亚洲成色999久久网站| 中文字幕v亚洲ⅴv天堂| 88国产精品欧美一区二区三区| 欧美色播在线播放| 91社区国产高清| 九九九久久国产免费| 亚洲在线观看视频| 国产自产女人91一区在线观看| 欧洲美女7788成人免费视频| 国产精品视频一区国模私拍| 精品亚洲男同gayvideo网站| 久久伊人91精品综合网站| 色偷偷噜噜噜亚洲男人的天堂| 中文字幕亚洲一区在线观看| 欧美成人免费一级人片100| 亚洲无亚洲人成网站77777| 久久久免费高清电视剧观看| 成人免费视频xnxx.com| 91性高湖久久久久久久久_久久99| 黑人巨大精品欧美一区免费视频| 在线国产精品播放| 欧美成人在线免费视频| 久久精品国产一区二区三区| 黄色一区二区三区| 中文字幕亚洲第一| 中文字幕一区日韩电影| 懂色av影视一区二区三区| 成人观看高清在线观看免费| 国产精品午夜一区二区欲梦| 欧美日韩国产丝袜美女| 日日噜噜噜夜夜爽亚洲精品| 国产欧美日韩高清| 日韩电影大全免费观看2023年上| 日韩精品视频免费在线观看| 亚洲电影免费观看高清完整版| 91夜夜揉人人捏人人添红杏| 国产精品亚洲自拍| 亚洲欧美在线免费| 国产亚洲激情视频在线| 日韩欧美黄色动漫| 久久视频免费观看| 亚洲国产精品悠悠久久琪琪| 国产欧美一区二区三区久久| 国产成人+综合亚洲+天堂| 亚洲自拍小视频| 亚洲另类激情图| 亚洲国内高清视频| 午夜精品一区二区三区在线播放| 亚洲欧美国产另类| 日本中文字幕久久看| 狠狠色噜噜狠狠狠狠97| 在线播放日韩av| 激情av一区二区| 亚洲欧美自拍一区| 在线视频国产日韩| 国产91成人在在线播放| 亚洲国产欧美在线成人app| 国产91精品久久久久久| 久久久电影免费观看完整版| 狠狠色狠色综合曰曰| 日韩天堂在线视频| 欧美激情精品久久久久久免费印度| 日韩女优人人人人射在线视频| 色婷婷综合久久久久中文字幕1| 亚洲人成伊人成综合网久久久| 欧美日韩爱爱视频| 日韩欧美aⅴ综合网站发布| 国产精品日韩欧美大师| 亚洲精品资源美女情侣酒店| 欧美性高潮床叫视频| 国产成人精品久久二区二区| 欧美激情国产高清| 成人黄色免费网站在线观看| 久久久国产91| 欧美激情一区二区三区高清视频| 91热精品视频| 尤物99国产成人精品视频| 夜夜嗨av一区二区三区四区| www.午夜精品| 日韩有码在线观看| 久久影院中文字幕| 中文字幕亚洲欧美| 久久久久北条麻妃免费看| 欧美又大又硬又粗bbbbb| 欧洲精品毛片网站| 91久久精品视频| 欧美性猛交xxxx乱大交极品| 92看片淫黄大片看国产片| 精品久久久久久中文字幕大豆网| 国产视频久久网| 国内精品一区二区三区| 国产精品女人久久久久久| 久久深夜福利免费观看| 亚洲国产精品成人va在线观看| 黄色成人在线免费| 亚洲人成网站免费播放| 亚洲欧美国产精品va在线观看| 欧美色图在线视频| 久久国产视频网站|