1. 程式人生 > >Shell筆記2——變量數值計算

Shell筆記2——變量數值計算

linux 運維 shell 腳本

本文檔主要講解Shell變量的數值計算與實踐

基本大綱:

1.算術運算符和命令介紹

2.雙小括號"(())"數值運算命令實踐

3.let運算命令的用法實踐

4.expr命令的用法實踐

5.bc命令的用法實踐

6.awk實現計算示例

7.$[ ]符號的運算示例

8.基於Shell變量輸入read命令的運算實踐




一:算術運算符和命令介紹


1、算術運算符

算術運算符 使用說明
+、- 加法(或正號)、減法(或負號)。
*、/、% 乘法、除法、取余。
** 冪運算。
<、<=、>、>=比較符號(小於、小於等於、大於、大於等於)
<<、>> 向左移位,向右移位
~、|、&、^按位取反、按位異或、按位與、按位或
!、&&、|| 邏輯非(取反)、邏輯與(and)、邏輯或(or)
==、!=、= 比較符號(相等、不相等、相當於)。
=、+=、-=、*=、/=、%= 賦值運算符。例如a+=1等於a=a+1。
++、-- 增加或減少、可前置也可放在變量結尾 *


2、算術運算命令

算術運算命令 使用說明
(()) 用於整數運算的常用運算符,效率較高。
let 用於整數運算,類似於“(())”。
expr 可用於整數運算。
bc Linux下的一個計算器程序(適合整數及小數運算)。
$[] 用於整數運算。
awk awk既可以用於整數運算,也可以用於小數運算。
declare


定義變量值和屬性,-i參數可以用於定義整型變量,做運算






二:雙小括號"(())"數值運算命令實踐

1)簡單的數值計算示例

[root@localhost practice]# echo $((1+1))

2

[root@localhost practice]# echo $((6-3))

3

[root@localhost practice]# ((i=5))

[root@localhost practice]# ((i=i*2))

[root@localhost practice]# echo $i

10


2)綜合算術計算示例

[root@localhost practice]# ((a=1+2**3-4%3))

[root@localhost practice]# echo $a

8

[root@localhost practice]# b=$((1+2**3-4%3))

[root@localhost practice]# echo $b

8

[root@localhost practice]# echo $((1+2**3-4%3))

8

[root@localhost practice]# a=$((100*(100+1)/2))

[root@localhost practice]# echo $a

5050

[root@localhost practice]# echo $((100*(100+1)/2))

5050


3)特殊運算符號的運算示例

[root@localhost practice]# a=1

[root@localhost practice]# echo $((a=a+1))

2

[root@localhost practice]# echo $((a+=1))

3

[root@localhost practice]# echo $((a**2))

9


4)利用雙括號進行比較和判斷

[root@localhost practice]# echo $((3<5)) #3<5的結果是成立的,因此輸出1,1表示真

1

[root@localhost practice]# echo $((3>5)) #3>5的結果是不成立的,因此輸出0,0表示假

0

[root@localhost practice]# echo $((8==8))

1

[root@localhost practice]# if ((6>5&&5==5));then echo "yes";fi

yes


5)在變量前後使用--和++特殊運算符

[root@localhost practice]# a=6

[root@localhost practice]# echo $((a++)) #因為a在運算符++的前面,那麽在輸出整個表達式,會輸出a的值,因為a為6,所有輸出為6

6

[root@localhost practice]# echo $a #執行上面的表達式後,因為有a++,因此a會自增1,因此輸出a的值為7

7

[root@localhost practice]# a=6

[root@localhost practice]# echo $((a--))

6

[root@localhost practice]# echo $a

5

[root@localhost practice]# a=10

[root@localhost practice]# echo $a

10

[root@localhost practice]# echo $((--a)) #因為a在運算符--的後面,那麽在輸出整個表達式,先進行自減 計算,因為a為10,自減1後為9,所以輸出9

9

[root@localhost practice]# echo $a #執行上面的表達式後,a自減1,所有為9

9

[root@localhost practice]# echo $((++a))

10

[root@localhost practice]# echo $a

10

經驗小結:

變量a在運算符之前,輸出的表達式的值為a本身,然後a自增或自減

變量a在運算符之後,輸出的表達式會先進行自增或自減, 表達式的值就是自增或自減後a的值


6)通過“(())"運算後賦值給變量

[root@localhost practice]# b=99

[root@localhost practice]# echo $((b+1))

100

[root@localhost practice]# echo $(( b + 1 )) #雙小括號的兩端有幾個空格都無所謂,不限制格式

100

[root@localhost practice]# b=$((b+1)) #將表達式的值賦值給變量

[root@localhost practice]# echo $b

100


7)各種"(())"運算的Shell腳本示例

[root@localhost practice]# cat test.sh

#!/bin/bash

a=10

b=5

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@localhost practice]# sh test.sh

a-b=5

a+b=15

a*b=50

a/b=2

a**b=100000

a%b=0




三:let運算命令的用法實踐

let運算命令的語法格式為:let賦值表達式

let賦值表達式的功能等同於“((賦值表達式))”

[root@localhost practice]# i=4

[root@localhost practice]# i=i+6

[root@localhost practice]# echo $i

i+6

[root@localhost practice]# unset i

[root@localhost practice]# i=4

[root@localhost practice]# let i=i+6

[root@localhost practice]# echo $i

10

let i=i+6等價於((i=i+6))




四:expr命令的用法實踐

expr命令用法: expr命令既可以用於整數運算,也可以用於相關字符串長度、匹配等的運算處理

1)expr用於計算

語法:expr Expression

註意:運算符及用於計算的數字左右都至少有一個空格,否則會報錯。

使用乘號時,必須用反斜線屏蔽其特定含義,因為Shell可能會誤解星號的含義。

[root@localhost practice]# expr 2 + 2

4

[root@localhost practice]# expr 2 - 2

0

[root@localhost practice]# expr 2 * 2

expr: syntax error

[root@localhost practice]# expr 2 \* 2 #這個*號需要用\來轉義

4

[root@localhost practice]# expr 2 / 2

1


2)expr配合變量計算

expr在Shell中可配合變量進行計算,但需要用反引號將計算表達式括起來

[root@localhost practice]# i=5

[root@localhost practice]# i=`expr $i + 5`

[root@localhost practice]# echo $i

10


3)expr判斷一個變量值或字符串是否為整數

[root@localhost practice]# i=5

[root@localhost practice]# expr $i + 6 &>/dev/null #把i和整數相加,&>/dev/null表示不保留任何輸出

[root@localhost practice]# echo $? #輸出返回值,返回0,則證明i的值為整數

0

[root@localhost practice]# i=ywxi

[root@localhost practice]# expr $i + 6 &>/dev/null

[root@localhost practice]# echo $? #輸出返回值,返回為非0,則證明i的值不為整數

2

結論:利用expr做計算,將一個未知的變量和一個已知的整數相加,看返回值是否為0,如果為0就可以判斷出未知變量是整數,否則就不是整數


4)expr match功能進行整數判斷

[root@localhost practice]# expr match 1 [0-9][0-9]*$

1

[root@localhost practice]# expr match 564641 [0-9][0-9]*$ #用正則匹配出符合要求的位數,大於0則為整數

6

[root@localhost practice]# cat exprmatch.sh #腳本測試

#!/bin/bash

if [[ `expr match "$1" [0-9][0-9]*$` == 0 ]]

then

echo "$1 is not a num"

else

echo "$1 is a num"

fi

[root@localhost practice]# sh exprmatch.sh 2 #為整數的輸出

2 is a num

[root@localhost practice]# sh exprmatch.sh dsa #不為整數的輸出

dsa is not a num



5)expr特殊用法:判斷文件擴展命名是否符合要求

[root@localhost practice]# cat expr5.sh

#!/bin/bash

if expr "$1" : ".*\.txt" &>/dev/null

then

echo "you are using $1"

else

echo "please use *.txt file"

fi

[root@localhost practice]# sh expr5.sh 1

please use *.txt file

[root@localhost practice]# sh expr5.sh 1.txt

you are using 1.txt

[root@localhost practice]# sed -n '10,20p' `which ssh-copy-id` #expr命令實現系統ssh服務自帶的ssh-copy-id公鑰分布腳本示例如下

if [ "-i" = "$1" ]; then

shift

# check if we have 2 parameters left, if so the first is the new ID file

if [ -n "$2" ]; then

if expr "$1" : ".*\.pub" > /dev/null ; then

ID_FILE="$1"

else

ID_FILE="$1.pub"

fi

shift # and this should leave $1 as the target name

fi


6)通過expr計算字符串的長度

[root@localhost practice]# char="I am ywxi"

[root@localhost practice]# expr length "$char"

9

[root@localhost practice]# echo ${#char} #常用的計算字符串長度方法

9

[root@localhost practice]# echo ${char}|wc -L

9

[root@localhost practice]# echo ${char}|awk '{print length($0)}'

9




五:bc命令的用法實踐

bc是類unix下的計算器,因此,除了可以作為計算機來使用,還可以作為命令行計算工具使用

[root@localhost practice]# bc #執行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+1

2

2*3+5

11

[root@localhost practice]# echo 5+3|bc

8

[root@localhost practice]# echo 5*3+5|bc

20

[root@localhost practice]# echo "scale=2;5/3"|bc #使用scale=2保留2位小數

1.66

[root@localhost practice]# echo "scale=5;5/3"|bc #使用scale=5保留5位小數

1.66666


重:多種運算法拓展實踐,通過一條命令輸出1+2+3+...+10的表達式,並計算出結果。

打印表達式的命令如下:

[root@localhost practice]# seq -s "+" 10

1+2+3+4+5+6+7+8+9+10

[root@localhost practice]# echo {1..10}|tr " " "+"

1+2+3+4+5+6+7+8+9+10

實現本題的多種方法:

[root@localhost practice]# echo `seq -s "+" 10`=`seq -s "+" 10|bc` #使用bc計算,bc命令獨有特點事除了支持證書運算之外,還支持小數運算

1+2+3+4+5+6+7+8+9+10=55

[root@localhost practice]# echo "`seq -s '+' 10`="$((`seq -s "+" 10`)) #使用"(( ))"計算

1+2+3+4+5+6+7+8+9+10=55

[root@localhost practice]# echo `seq -s '+' 10`=`seq -s " + " 10|xargs expr` #使用expr計算,註意用於計算的數字左右都至少有一個空格,否則會報錯

1+2+3+4+5+6+7+8+9+10=55

[root@localhost practice]# echo `seq -s '+' 10`=$(echo $[`seq -s "+" 10`]) #使用$[ ]計算.

1+2+3+4+5+6+7+8+9+10=55




六:awk實現計算示例

awk進行運算效果也很好,適合小數和整數,特別是命令行計算,尤其是小數,運算很精確,並且方便。

[root@localhost practice]# echo "6.6 3.3"|awk '{print ($1-$2)}'

3.3

[root@localhost practice]# echo "6.6 3.3"|awk '{print ($1-2)/$2}'

1.39394

[root@localhost practice]# echo "6.6 3.3"|awk '{print ($1+2)*$2}'

28.38




七:$[ ]符號的運算示例

[root@localhost practice]# i=5

[root@localhost practice]# i=$[i+3]

[root@localhost practice]# echo $i

8

[root@localhost practice]# i=$[i-2]

[root@localhost practice]# echo $i

6

[root@localhost practice]# echo $[2*3]

6

[root@localhost practice]# echo $[2**3]

8

[root@localhost practice]# echo $[2/3]

0

[root@localhost practice]# echo $[2%3]

2

下面是解決問題的實例:打印楊輝三角

[root@localhost practice]# cat sanjiao.sh

#!/bin/bash

if (test -z $1) ;then

read -p "Input Max Lines:" MAX

else

MAX=$1

fi

i=1

while [ $i -le $MAX ] #i行控制

do

j=1

while [ $j -le $i ] #j列控制

do

f=$[i-1] #f=i-1 這是另一種計算寫法。

g=$[j-1] #g=j-1 這是另一種計算寫法。

if [ $j -eq $i ] || [ $j -eq 1 ] ; then

declare SUM_${i}_$j=1 #聲明變量 頭尾都是1

else

declare A=$[SUM_${f}_$j] #取上一行的j列變量

declare B=$[SUM_${f}_$g] #取上一行的j-1列變量

declare SUM_${i}_$j=`expr $A + $B` #聲明並計算當前變量的值

fi

echo -en $[SUM_${i}_$j]" " #輸出當前變量

let j++

done

echo #換行

let i++

done




八:基於Shell變量輸入read命令的運算實踐

1)read命令

語法格式:read 【參數】【變量名】

常用參數: -p(prompt) :設置提示信息 -t(timeout):設置輸入等待的時間,單位默認為秒

read基本的讀入功能示例:

[root@localhost practice]# read -t 5 -p "please input one num:" num #-t設置等待時間,時間超過就退出了,一般不設置這個值

please input one num:1

[root@localhost practice]# echo $num

1

[root@localhost practice]# read -p "please input two number:" a b #read的讀入功能就相當於交互式接受用戶輸入,然後給變量賦值,體現了變量賦值靈活

please input two number:2 3

[root@localhost practice]# echo $a

2

[root@localhost practice]# echo $b

3

等價於echo -n "please input two number:" ;read a b


2)read運用於腳本變量讀取賦值示例:

腳本1:

[root@localhost practice]# cat 3.sh

#!/bin/bash

echo -n "Enter your name:" #參數-n的作用是不換行,echo默認是換行

read name #從鍵盤輸入

echo "hello $name,welcome to my program" #顯示信息

exit 0 #退出shell程序。

[root@localhost practice]# sh 3.sh

Enter your name:ywxi

hello ywxi,welcome to my program


腳本2:

#該例子使用了-n選項,後接數值1個,指示read命令只要接受到一個字符就退出。只要按下一個字符進行回答,read命令立即接受輸入並將其傳給變量。無需按回車鍵。

[root@localhost practice]# cat 4.sh

#!/bin/bash

read -n1 -p "Do you want to continue [Y/N]: " answer

case $answer in

Y | y)

echo -e "\nfine ,continue";;

N | n)

echo "ok,good bye";;

*)

echo "error choice";;

esac

exit 0

[root@localhost practice]# sh 4.sh

Do you want to continue [Y/N]: Y

fine ,continue

[root@localhost practice]# sh 4.sh

Do you want to continue [Y/N]: y

fine ,continue


腳本3:

#最後,還可以使用read命令讀取Linux系統上的文件。每次調用read命令都會讀取文件中的"一行"文本。當文件沒有可讀的行時,read命令將以非零狀態退出。

#讀取文件的關鍵是如何將文本中的數據傳送給read命令。

#最常用的方法是對文件使用cat命令並通過管道將結果直接傳送給包含read命令的while命令。

[root@localhost practice]# cat 5.sh

#!/bin/bash

count=1 #賦值語句,不加空格

cat test | while read line #cat 命令的輸出作為read命令的輸入,read讀到的值放在line中

do

echo "Line $count:$line"

count=$[ $count + 1 ] #註意中括號中的空格。

done

echo "finish"

exit 0

[root@localhost practice]# cat test

read

test

ywxi

[root@localhost practice]# sh 5.sh

Line 1:read

Line 2:test

Line 3:ywxi

finish





Shell筆記2——變量數值計算