Shell筆記2——變量數值計算
基本大綱:
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——變量數值計算