詳解Shell編程之變量數(shù)值計(jì)算(一)
如果要執(zhí)行運(yùn)算,那就少不了運(yùn)算符,和其他的編程語言相似,shell也有很多的運(yùn)算符如下:
+、-、:代表著加號 和減號 或者,負(fù)號
*、/、%:代表著乘號,除號,和取模。
** : 冪運(yùn)算
++、-- :表示著增加或者減少,它可以放在前置,也可以放在變量的結(jié)尾
!、||、&&、(取反)(或) (and)
<、<=、>、>= :比較符號,小于、小于等于、大于、大于等于
==、!=、= :相等,不相等, =表示相等于
<< >> 向左移動 向右移動
等等,這里就不說了 到后面實(shí)踐中再見!
Shell編程之算術(shù)運(yùn)算命令
(()) 用于整數(shù)之間常用的運(yùn)算符,效率高
let :用于整數(shù)運(yùn)算,類似于(())
expr :用于整數(shù)運(yùn)算,但是還有其他功能
bc :Linux下的一個計(jì)算程序,適合整數(shù)及小數(shù)運(yùn)算
$[] :用于整數(shù)運(yùn)算
awk:awk既可以整數(shù)運(yùn)算,也可以小數(shù)運(yùn)算
declare: 定義變量值和屬性,-i參數(shù)可以用于定義整形變量,做運(yùn)算
第一眼看到這些 感覺很復(fù)雜,心亂,但是沒有關(guān)系,慢慢的就好了~~~
一、雙小括號(()) 數(shù)值運(yùn)算命令
雙小括號的作用是進(jìn)行數(shù)值運(yùn)算與數(shù)值的比較,它的效率很高,用法很靈活,是企業(yè)運(yùn)維人員經(jīng)常采用的操作符
((e=e+1)) 它的作用就是把e+1的結(jié)果賦值給變量e但是不可以用 echo ((e=e+1))來使用,但可以使用echo $((e=e+1))
e=$((e=e+1)) 作用就是把e+1的執(zhí)行結(jié)果賦值給變量e
數(shù)值比較
((8>7&&5==5)) 用于數(shù)值之前的比較,用于條件判斷
echo $((2+1)) 用于直接輸出運(yùn)算表達(dá)式的結(jié)果,在(()) 前面加$符號
案例1:雙小括號"(())"數(shù)值運(yùn)算實(shí)踐
[root@shell-yankerp sh]# echo $((1+1)) #計(jì)算1+1后輸出 2 #那么結(jié)果就是等于2 [root@shell-yankerp sh]#
以此類推使用減號
[root@shell-yankerp sh]# echo $((6-3)) #計(jì)算6-3等于多少 3 #結(jié)果為3 [root@shell-yankerp sh]#
是不是感覺有點(diǎn)簡單。那么接下來利用"(())"進(jìn)行稍微復(fù)雜的一些綜合算術(shù)運(yùn)算
[root@shell-yankerp sh]# ((a=1+2**3-4%3))
以上例子也就是說,首先a是一個變量名,那么在a=后面的一些計(jì)算的結(jié)果會賦值給a這個變量,那么首先我們得知道后面的計(jì)算結(jié)果是多少,在這個變量中 我們用到了+號"**"以及"-"號包括“%”首先計(jì)算過程是這樣的。先算乘除,后算加減
2**3 等于 2x2x2=8 乘算出來之后算除。 4%3=1 取模---- 8-1=7 最后1+7=8 最后結(jié)果為8 輸出如下:
例如2:
[root@shell-yankerp sh]# b=$((1+2**3-4%3)) #在這里b是一個變量 將變量名的計(jì)算結(jié)果賦值給b [root@shell-yankerp sh]# echo $b #輸出如下: 8 [root@shell-yankerp sh]#
其實(shí)例1 和2都是差不多的 只不過是用了不同的方法!??!
例3:特殊運(yùn)算符號的運(yùn)算實(shí)例
[root@shell-yankerp sh]# a=8 #首先a變量名 = 變量值 等于8 那么a就是8 [root@shell-yankerp sh]# echo $((a=a+2)) #原來a=8 那么現(xiàn)在a+2 結(jié)果為10 10 [root@shell-yankerp sh]# echo $((a+=1)) #當(dāng)結(jié)果為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:利用(())雙括號,進(jìn)行比較判斷
[root@shell-yankerp sh]# echo $((2>1)) #當(dāng)條件2>1正確后輸出了1表示真 1 [root@shell-yankerp sh]# echo $((2>3)) #當(dāng)條件2>3錯誤后輸出0 0 [root@shell-yankerp sh]# echo $((6==6)) #6==6 那么就輸出1 1 [root@shell-yankerp sh]#
if 判斷小實(shí)戰(zhàn)
在以上的圖中不用想肯定是輸出條件成立繼續(xù)運(yùn)行了因?yàn)?本來就大于5;7本來就等于7 輸出如下:
我們嘗試的改下腳本如下:
在上圖中8等于5肯定是錯誤的 那么輸出如下:
上面涉及到了數(shù)字及變量必須為整數(shù),不能是小數(shù)... 但是可以用bc來解決后面會說到。
案例:在變量前后使用++、--、特殊運(yùn)算符的表達(dá)式
首先我們需要知道++是什么意思
++、-- :表示著增加或者減少,它可以放在前置,也可以放在變量的結(jié)尾
[root@shell-yankerp sh]# a=10 [root@shell-yankerp sh]# echo $((a++)) 10 [root@shell-yankerp sh]# echo $a 11 [root@shell-yankerp sh]#
以上內(nèi)容中的a=10 那么a是變量名 變量值等于10 那么echo $((a++)) ++的意思上面已經(jīng)說過了,輸出結(jié)果為10 因?yàn)?+在a的后面 所以先輸出a的值為10 那么繼續(xù)echo $a 那么就變成11 因?yàn)閍++后面增加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]#
以上就是--的用法了。這里不在說了
在以下的案例中我相信的大家肯定知道了在前面加++ 和在后面加++的區(qū)別了 如下:
[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]#
例:通過(())運(yùn)算后賦值給變量
[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]#
在以上的案例中,有空格和沒空格都是一樣的。
包含(())各種常見的運(yùn)算符命令執(zhí)行如下:
[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]#
各種(())運(yùn)算的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))"
輸出結(jié)果為如下:
[root@shell-yankerp sh]# sh test.sh
a-b=3
a+b=9
a/b=2
a**b=216
[root@shell-yankerp sh]#
特殊位置變量+數(shù)值運(yùn)算實(shí)戰(zhàn)案例如下:
#!/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))
在以上的腳本中 我們定義了特殊的位置變量 下面定義了數(shù)值運(yùn)算,那么這個腳本的功能是,當(dāng)我們輸入兩個字符,其中第一個字符賦值給了變量a 第二個字符賦值給了變量b 那么在下面進(jìn)行數(shù)值運(yùn)算,如果此腳本看不懂的大家可以參考我這篇文章http://www.dbjr.com.cn/article/134246.htm
運(yùn)行結(jié)果如下:
[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]#
這也就是特殊位置變量+本章的變量數(shù)值運(yùn)算的結(jié)合
let運(yùn)算命令的用法
例如
[root@shell-yankerp ~]# a=2 [root@shell-yankerp ~]# a=a+8 #沒有用let [root@shell-yankerp ~]# echo $a a+8 #輸出結(jié)果 [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 ~]#
其實(shí)還可以這么實(shí)現(xiàn),如下:
[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 ~]#
兩者區(qū)別?。?!如上
expr命令用法實(shí)例:
[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]#
當(dāng)我們選擇用*號需要拿\轉(zhuǎn)義、需要注意在用expr命令時 左右兩側(cè)必須要空格
2、expr配合變量實(shí)例
[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的企業(yè)級實(shí)戰(zhàn)案例:
[root@shell-yankerp sh]# i=5 #這里設(shè)置了一個變量 i=5 [root@shell-yankerp sh]# expr $i + 6 &>/dev/null #那么我們使用expr命令 $i + 6 這里的6是一個整數(shù) [root@shell-yankerp sh]# echo $? #執(zhí)行完成后我們使用特殊變量 $?來判斷以上命令 0 ---返回結(jié)果為0 [root@shell-yankerp sh]# expr $i + zhangsan &>/dev/null #同時這里又設(shè)置了一個變量 在這里的zhangsan是字符串 [root@shell-yankerp sh]# echo $? #使用特殊變量判斷 2 #結(jié)果為2 [root@shell-yankerp sh]#
利用expr做計(jì)算,將一個未知的變量和一個已知的一個整數(shù)相加,看返回的值是否為0,如果默認(rèn)是0 那么就是一個整數(shù)。如果非0則輸入的就是字符串不是整數(shù)。
例:通過參數(shù)判斷輸出內(nèi)容是否為整數(shù)
#!/bin/bash expr $1 + 1 &>/dev/null #這里是一個命令 使用了expr 也使用了特殊的位置變量 if [ "$?" -eq 0 ] #如果以上命令執(zhí)行結(jié)果為0 then #那么 echo "輸入的是整數(shù)~" #輸出一條 輸入的是整數(shù) else #否則 echo "/bin/sh $# 請輸入一個整數(shù)" 這里也使用了特殊的位置變量 fi
運(yùn)行腳本測試
[root@shell-yankerp sh]# cat aaa.sh #!/bin/bash expr $1 + 1 &>/dev/null if [ "$?" -eq 0 ] then echo "輸入的是整數(shù)~" else echo "/bin/sh $0 請輸入一個整數(shù)" fi [root@shell-yankerp sh]# sh aaa.sh 123 輸入的是整數(shù)~ [root@shell-yankerp sh]# sh aaa.sh zhangsan lisi /bin/sh aaa.sh 請輸入一個整數(shù) [root@shell-yankerp sh]#
實(shí)戰(zhàn):第一關(guān)判斷參數(shù)個數(shù)是否為2.若不是請給出提示
第二關(guān)判斷參數(shù)是否為整數(shù),如果不是那么繼續(xù)給出提示
第三關(guān)做運(yùn)算~~~
#!/bin/bash if [ "$#" -ne "2" ] then echo "/bin/bash $0 請輸出兩個數(shù)值..." exit 1 fi #no.2 a=$1 b=$2 expr $1 + 1 &>/dev/null if [ "$?" -ne "0" ] then echo "請輸入數(shù)值..." 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))"
剖析:在以上腳本中其實(shí)很簡單,第一if 如果輸入的不是兩個傳參值,那么給出提示 這是第一段if條件語句,如果輸入的是兩個數(shù)值,那么繼續(xù)執(zhí)行下面的條件,在第二個條件使用了位置參數(shù)變量$1 使用了expr命令來判斷用戶輸入的是數(shù)字還是字符串,當(dāng)用戶輸入的是數(shù)字那么就是返回是成功的 那么我們使用了if語句 如果上面命令執(zhí)行成功 如果不等于0 那么給出相應(yīng)的提示,最后前面的兩個條件成立,那么接下來進(jìn)行算法,這個前面是說過的。
執(zhí)行腳本如下:
好了 本次就到這里,希望閱讀者快快吸收~~~ 后續(xù)不斷更新 謝謝大家,也希望大家多多支持腳本之家。
聲明:以上文章是<<跟著老男孩學(xué)Linux運(yùn)維Shell編程實(shí)戰(zhàn)>>第五章;一部分看完的總結(jié)!
- Linux命令行和shell腳本編程寶典 Richard Blum
- shell腳本編程之for語句、if語句使用介紹
- Linux shell腳本編程if語句的使用方法(條件判斷)
- 5個Shell腳本編程入門練習(xí)例子
- Shell腳本編程中常用的數(shù)學(xué)運(yùn)算實(shí)例
- shell 編程中空格的使用方法
- Shell 編程:Bash空格的那點(diǎn)事
- shell腳本編程實(shí)現(xiàn)9*9乘法表
- Linux Shell 腳本編程入門教程
- Shell腳本編程之判斷語句
- shell腳本編程之循環(huán)語句
- Shell編程中while與for的區(qū)別及用法詳解
- Linux下Shell編程快捷鍵大全(日常整理)
- 詳解Shell編程之if語句實(shí)戰(zhàn)(小結(jié))
- Shell編程之case語句實(shí)戰(zhàn)(小結(jié))
- 對Linux下shell編程之for循環(huán)的實(shí)例講解
- Shell腳本編程30分鐘入門(小結(jié))
- shell編程入門之變量,字符串,數(shù)組,函數(shù)使用方法總結(jié)
相關(guān)文章
Linux Shell 生成隨機(jī)數(shù)和隨機(jī)字符串的方法示例
這篇文章主要介紹了Linux Shell 生成隨機(jī)數(shù)和隨機(jī)字符串的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-02-02Shell執(zhí)行/調(diào)用Java/Jar程序例子的實(shí)例詳解
這篇文章主要介紹了Shell執(zhí)行/調(diào)用Java/Jar程序例子的實(shí)例詳解的相關(guān)資料,這里提供實(shí)例幫助大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下2017-08-08shell中各種括號的作用詳解()、(())、[]、[[]]、{}(推薦)
本文給大家收藏整理了shell中各種括號的作用,非常不錯,具有參考借鑒價值,需要的朋友參考下吧2017-09-09script_tool_for_linux.bash: Linux 環(huán)境下的 hosts 一鍵部署腳本
這篇文章主要介紹了script_tool_for_linux.bash: Linux 環(huán)境下的 hosts 一鍵部署腳本,需要的朋友可以參考下2016-04-04shell腳本實(shí)現(xiàn)linux系統(tǒng)文件完整性檢測
這篇文章主要介紹了shell腳本實(shí)現(xiàn)linux系統(tǒng)文件完整性檢測,本文給出的腳本使用對比MD5的方法,檢測linux系統(tǒng)文件是否被替換等問題,需要的朋友可以參考下2014-12-12Linux Bash 提示符的一些騷操作(自定義 Bash 提示符)
這篇文章主要介紹了Linux Bash 提示符的一些騷操作,一些能讓你自定義 Bash 提示符的黑科技,需要的朋友可以參考下2017-07-07