Shell階段02 shell變數運算(整數運算/小數運算), shell變數案例

战斗小人發表於2024-05-06

Shell變數運算

加減乘除 求餘
num1 + num2
num1 - num2
num1 * num2
num1 / num2
num1 % num2        求餘

整數運算

expr
$(())
$[]
let
只支援整數運算,不支援小數運算

expr    數值之間必須要有空格進行分開,當使用*乘的時候,需要對其進行轉義使用,不能進行次方運算

[root@shell01 scripts]# expr 1 + 1
2
[root@shell01 scripts]# num1=10
[root@shell01 scripts]# num2=5
[root@shell01 scripts]# expr $num1 + $num2
15
[root@shell01 scripts]# expr $num1 \* $num2      #這裡\取消*的特殊含義
50
[root@shell01 scripts]# expr $num1 / $num2
2
[root@shell01 scripts]# expr $num1 % $num2
0

$(())    沒有嚴格的格式要求,不能進行次方運算

[root@shell01 scripts]# echo $(($num1+$num2))    #$(())沒有嚴格的格式要求,當中不用有空格
15
[root@shell01 scripts]# echo $(( $num1 - $num2 ))
5
[root@shell01 scripts]# echo $(( $num1 * $num2 ))
50
[root@shell01 scripts]# echo $(( $num1 / $num2 ))
2
[root@shell01 scripts]# echo $(( $num1 % $num2 ))
0

$[]        沒有嚴格的格式要求,不能進行次方運算

[root@shell01 scripts]# echo $[$num1+$num2]
15
[root@shell01 scripts]# echo $[$num1 - $num2]
5
[root@shell01 scripts]# echo $[$num1 * $num2]
50
[root@shell01 scripts]# echo $[$num1 / $num2]
2
[root@shell01 scripts]# echo $[$num1 % $num2]
0

let        計數

[root@shell01 scripts]# a=10
[root@shell01 scripts]# let a++
[root@shell01 scripts]# let a++
[root@shell01 scripts]# echo $a
12
[root@shell01 scripts]# let a--
[root@shell01 scripts]# let a--
[root@shell01 scripts]# echo $a
10

小數運算

bc        awk        python

bc預設是沒有的,需要下載
[root@shell01 scripts]# yum install -y bc
[root@shell01 scripts]# bc    #互動式運算一般不用,除法值也有問題
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
... 
1+1
2
3/2
1
[root@shell01 scripts]# echo 10 + 20 |bc
30
[root@shell01 scripts]# echo $num1
10
[root@shell01 scripts]# $num3=3
[root@shell01 scripts]# echo $num1 + $num3 |bc 
13
[root@shell01 scripts]# echo $num1 / $num3|bc  #計算值有問題,沒有小數位
3
[root@shell01 scripts]# echo "scale=2;$num1 / $num3"|bc  #scale設定小數位為2位
3.33
[root@shell01 scripts]# echo $num1 ^ $num3 |bc     #次方運算
1000

awk    預設對檔案進行操作,加入行處理前BEGIN就不會報錯,直接進行計算
BEGIN    行處理前

[root@shell01 scripts]# awk 'BEGIN{print 10 + 5}'
15
[root@shell01 scripts]# awk 'BEGIN{print 10 - 5}'
5
[root@shell01 scripts]# awk 'BEGIN{print 10 * 5}'
50
[root@shell01 scripts]# awk 'BEGIN{print 10 / 5}'
2
[root@shell01 scripts]# awk 'BEGIN{print 10 % 5}'
0
[root@shell01 scripts]# awk 'BEGIN{print 10 ^ 5}'    #支援次方運算
100000
[root@shell01 scripts]# awk 'BEGIN{print 10 / 3}'    #除法小數位是隨機的,最大5位
3.33333
[root@shell01 scripts]# awk 'BEGIN{printf "%.3f\n",10/3}' #自定義小數位,採用python寫法,\n進行換行
3.333

#注意awk用外部變數,要用雙引號
[root@shell01 scripts]# awk "BEGIN{print $num1/$num2}"
2

#awk可以用內部變數  -v #自定義內部變數
[root@shell01 scripts]# awk -vnum1=10 -vnum2=5 'BEGIN{print num1/num2}' #這裡變數前不要加$,不然變列行
2

python

[root@shell01 scripts]# python    #互動式
Python 2.7.5 (default, Oct 30 2018, 23:45:53) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 10/3
3
>>> 10.0/3    #要得到小數,首先把數字變為浮點型
3.3333333333333335

[root@shell01 scripts]# echo "print $num1 + $num2" | python        #這裡採用python的寫法
15
[root@shell01 scripts]# echo "print $num1 - $num3" | python
7
[root@shell01 scripts]# echo "print $num1 / $num3" | python
3
[root@shell01 scripts]# echo "print ${num1}.0 / $num3" | python
3.33333333333

變數運算案例

1.ps aux命令下,求VSZ列的和        (VSZ虛擬記憶體集,RSS實體記憶體集)
#第一種
[root@shell01 ~]# ps aux | awk 'NR>1{print $5}'|xargs    #xargs分組作用,把一列分成一行
125884 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 37116 45744 0 0 0 0 0 0 0 0 0 0 0 0 62052 0 0 228320 26380 58236 73656 201724 612240 99576 300828 473820 225828 126388 110192 573932 112764 220792 89556 89728 161372 116332 89660 0 0 0 0 155464 113640 116332
[root@shell01 ~]# ps aux | awk 'NR>1{print $5}'|xargs |tr ' ' '+'
125884+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+0+37116+45744+0+0+0+0+0+0+0+0+0+0+0+0+62052+0+0+228320+26380+58236+73656+201724+612240+99576+300828+473820+225828+126388+110192+573932+112764+220792+89556+89728+161372+116332+89660+0+0+0+155464+113640+108352+108076
[root@shell01 ~]# ps aux | awk 'NR>1{print $5}'|xargs |tr ' ' '+'|bc
4863984

#第二種
[root@shell01 ~]# ps aux | awk 'NR>1{i+=$5}END{print i}'    #第五列相加,END等前面計算結束
4531224

#第三種
[root@shell01 scripts]# vim for_vsz.sh
#!/bin/bash
he=0
for i in $(ps aux| awk 'NR>1{print $5}')
do
    he=$(expr $he + $i)
done
echo $he
[root@shell01 scripts]# sh -x for_vsz.sh    #-x顯示指令碼執行過程


2.寫個指令碼,實現一個簡單的計算器,實現加減乘除
[root@shell01 scripts]# vim jsq.sh
#!/bin/bash
read -p "請輸入你要計算的第一個數字:" num1
read -p "請輸入你要計算的第二個數字:" num2
echo "$num1 + $num2 = $[ $num1 + $num2 ]"
echo "$num1 - $num2 = $[ $num1 - $num2 ]"
echo "$num1 * $num2 = $[ $num1 * $num2 ]"
echo "$num1 / $num2 = $(awk "BEGIN{print $num1 / $num2}")"

Shell變數案例

1.使用Shell指令碼列印,系統版本、核心版本平臺、虛擬平臺、靜態主機名、eth0網路卡IP地址、lo網路卡IP地址、當前主機的外網IP地址
curl icanhazip.com 或者 curl ifconfig.me #當前主機的外網IP地址 awk
'{print$1,$4}' /etc/redhat-release #系統版本資訊 hostnamectl | awk '/Kernel/{print $3}' #Kernel核心版本資訊 hostnamectl | awk '/Virtua/{print $2}' #虛擬平臺 hostnamectl | awk '/hostname/{print $3}' #靜態主機名 ifconfig eth0|awk 'NR==2{print $2}' #eth0網路卡IP地址 ifconfig lo|awk 'NR==2{print $2}' #lo網路卡IP地址 [root@shell01 scripts]# vim var.sh #!/bin/bash Version=$(awk '{print$1,$4}' /etc/redhat-release) Kernel=$(hostnamectl | awk '/Kernel/{print $3}') Vm=$(hostnamectl | awk '/Virtua/{print $2}') Static_Hostname=$(hostnamectl | awk '/hostname/{print $3}') Eth0=$(ifconfig eth0|awk 'NR==2{print $2}') Lo=$(ifconfig lo|awk 'NR==2{print $2}') Wan=$(curl -s ifconfig.me) #-s:不輸出錯誤和進度資訊 echo "當前系統版本號為: $Version" echo "當前系統核心版本號為: ${Kernel%.e*}" echo "當前系統虛擬化平臺為: $Vm" echo "當前系統靜態主機名為: $Static_Hostname" echo "當前系統的Eth0網路卡IP地址為: $Eth0" echo "當前系統的Lo網路卡IP地址為: $Lo" echo "當前系統的外網IP地址為: $Wan" ---------------------------------------------------- 2.需求描述:變數string="Bigdata process is Hadoop, Hadoop is open source project",執行指令碼後,列印輸出string變數,並給出使用者以下選項: #需求 1)列印string長度 2)刪除字串中的所有Hadoop 3)替換第一個Hadoop為Linux 4)替換全部Hadoop為Linux 使用者請輸入數字1|2|3|4,可以執行對應項的功能。 [root@shell01 scripts]# vim var-1.sh #!/bin/bash #1.定義變數 String='Bigdata process is Hadoop, Hadoop is open source project' #2.列印變數 echo $String #3.輸出選單 cat<<EOF 1)列印string長度 2)刪除字串中的所有Hadoop 3)替換第一個Hadoop為Linux 4)替換全部Hadoop為Linux EOF #4.提示使用者輸入對應的數字,執行對應的功能 read -p "請輸入上方選單對應的數字,執行對應的功能[1|2|3|4]: " Num #5.根據使用者輸入的數字進行執行對應的功能 if [ $Num -eq 1 ];then echo "列印string長度" echo ${#String} fi if [ $Num -eq 2 ];then echo "刪除字串中的所有Hadoop" echo ${#String//Hadoop/} fi if [ $Num -eq 3 ];then echo "替換變數中第一個Hadoop為Linux" echo ${#String/Hadoop/Linux} fi if [ $Num -eq 4 ];then echo "替換變數中全部Hadoop為Linux" echo ${#String//Hadoop/Linux} fi

相關文章