您好,登錄后才能下訂單哦!
如果要執行算術運算,就會離不開各種運算符號,和其他編程語言類似,Shell也有很多算術運算符。
常見的運算符號,如圖:
常見的運算命令,如圖:
下面詳細介紹一下,各種運算命令的詳細用法:
雙小括號“(())”的作用是進行數值運算與數值比較,它的效率很高,用法靈活,是企業場景中運維人員經常采用的運算操作符,具體操作語法,如圖:
詳細介紹其使用方法:
進行簡單的運算,如下:
[root@localhost ~]# echo $((1+1))
2
//計算1+1的結果再輸入
[root@localhost ~]# ((i=5))
[root@localhost ~]# ((i=i*2))
[root@localhost ~]# echo $i
10
//首先定義i的值,其次進行運算,最后輸出結果
稍微復雜一些的綜合運算,如下:
[root@localhost ~]# ((a=1+2**3-4%3)) && echo $a
8
//“**”表示幾次方的意思,“%”表示取余的意思
//計算順序就是先乘除再加減,
//最后通過echo輸出結果
特殊符號運算示例:
[root@localhost ~]# a=1
[root@localhost ~]# echo $((a=a+1))
2
//將“a+1”重新賦值給a,然后輸出結果
[root@localhost ~]# echo $((a+=1))
3
//“+=”表示“a=a+1”,重新復制給a
[root@localhost ~]# echo $((a**2))
9
//“**”表示冪次方,現在a的值是3,平方當然是9
利用“(())”雙括號進行比較及判斷示例:
[root@localhost ~]# echo $((1<2))
1
//1表示結果的成立的,相反,0則表示結果不成立
[root@localhost ~]# echo $((2<1))
0
上面示例中所涉及到的數字及變量必須為整數,不能是小數點及字符串。
特殊符號“++”、“--”所表示的含義:
[root@localhost ~]# a=10
[root@localhost ~]# echo $((a++))
10
[root@localhost ~]# echo $a
11
[root@localhost ~]# echo $((a--))
11
[root@localhost ~]# echo $a
10
[root@localhost ~]# echo $((--a))
9
[root@localhost ~]# echo $a
9
[root@localhost ~]# echo $((++a))
10
[root@localhost ~]# echo $a
10
通過示例可以看出:執行echo$((a++))和echo$((a--))命令輸出整個表達式時,輸出的值即為a的值,表達式執行完畢后,會對a進行++、--的運算,而執行echo$((++a))和echo$((--a))命令輸出整個表達式時,會先對a進行++、--的運算,然后再輸出表達式的值,即為a運算后的值。
“(())”表達式在命令行執行時不需要加$符號,直接使用((6%2))形式即可,但是如果需要輸出,就要加$符,例如:echo$((6%2))。
·“(())”里的所有字符之間沒有空格、有一個或多個空格都不會影響結果。
shell腳本小示例:
簡單的復雜運算的腳本
第一種,不太實用:
[root@bogon ~]# vim test.sh
#!/bin/bash
a=6
b=2
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@bogon ~]# sh test.sh
6-2=4
6+2=8
6*2=12
6/2=3
6**2=36
6%2=0
第二種,實用:
[root@bogon ~]# vim test1.sh
#!/bin/bash
echo "$1-$2=$(($1-$2))"
echo "$1+$2=$(($1+$2))"
echo "$1*$2=$(($1*$2))"
echo "$1/$2=$(($1/$2))"
echo "$1**$2=$(($1**$2))"
echo "$1%$2=$(($1%$2))"
[root@bogon ~]# sh test1.sh 10 2
10-2=8
10+2=12
10*2=20
10/2=5
10**2=100
10%2=0
使用read命令等待輸入,
第一種方法:
[root@bogon ~]# vim test2.sh
#!/bin/bash
print_usage(){
#定義一個整數
printf "Please enter an integer\n"
#打印信息“請輸入一個整數”
exit 1
#返回值為1,退出腳本
}
read -p "Please input first number:" A
#請輸入第一個數字
if [ -n "`echo ${A}|sed 's/[0-9]//g'`" ]
#判斷是否為整數,用0-9替換$A的值,進而判斷是否為數字
then
print_usage
#如果上述變量值不為空,說明不是整數,則調用用戶幫助函數
fi
read -p "Please input the operators:" B
#請輸入操作符
if [ "${B}" != "+" ] && [ "${B}" != "-" ] && [ "${B}" != "*" ] && [ "${B}" != "/" ] && [ "${B}" != "%" ] && [ "${B}" != "**" ]
#判斷輸入的內容是否為+、-、*、/、%、**
then
echo "Please use{+|-|*|/|%|**}"
#如果操作符不符合要求,則給出提示
exit 2
#因為不符合要求,因此以返回值為2退出腳本,表示錯誤
fi
read -p "Please input second number: " C
#請輸入第二個數字
if [ -n "`echo ${C}|sed 's/[0-9]//g'`" ]
#判斷是否為整數,用0-9替換$C的值,進而判斷是否為數字
then
print_usage
#如果上述變量值不為空,說明不是整數,則調用用戶幫助函數
fi
echo "${A}${B}${C}=$((${A}${B}${C}))"
#最后輸出結果
[root@bogon ~]# sh test2.sh
Please input first number:10
Please input the operators:/
Please input second number: 2
10/2=5
第二種:
[root@bogon ~]# vim test3.sh
#!/bin/bash
print_usage(){
printf $"USAGE:$0 NUM1 {+|-|*|/} NUM2\n"
#打印幫助信息
exit 1
}
if [ $# -ne 3 ]
#如果腳本傳入的參數個數不等于3個(因為要輸入兩個數字及一個運算符號)。
then
print_usage
#則調用用戶幫助函數。
fi
A=$1
C=$3
B=$2
if [ -n "`echo ${A}|sed 's/[0-9]//g'`" ]
then
print_usage
fi
if [ "${B}" != "+" ] && [ "${B}" != "-" ] && [ "${B}" != "*" ] && [ "${B}" != "/" ]
#判斷第二個輸入的操作符是否為+、-、*、/
then
print_usage
fi
if [ -n "`echo ${C}|sed 's/[0-9]//g'`" ]
then
print_usage
fi
echo "${A}${B}${C}=$((${A}${B}${C}))"
[root@bogon ~]# sh test3.sh 10 + 2
10+2=12
[root@bogon ~]# sh test3.sh 10 - 2
10-2=8
[root@bogon ~]# sh test3.sh 10 \* 2
10*2=20
[root@bogon ~]# sh test3.sh 10 / 2
10/2=5
最簡單、高效的一種辦法就是:
[root@bogon ~]# cat test4.sh
echo $(($1))
//利用兩個雙括號計算
[root@bogon ~]# sh test4.sh 5+5
10
[root@bogon ~]# sh test4.sh "5 + 5"
10
//如果帶空格使用雙引號
let賦值表達式的功能等同于“((賦值表達式))”
比如:
[root@bogon ~]# i=2
[root@bogon ~]# i=i+8
[root@bogon ~]# echo $i
i+8
//開頭不用let,輸出時并不會輸出計算結果
[root@bogon ~]# unset i
[root@bogon ~]# i=2
[root@bogon ~]# let i=i+8
[root@bogon ~]# echo $i
10
//使用let開頭,輸出是則會輸出計算結果
[root@bogon ~]# ((i=i+10))
[root@bogon ~]# echo $i
20
let i=i+8與((i=i+8))效果一樣,推薦使用第二種!
expr命令既可以用于整數運算,也可用于相關字符串長度、匹配等的運算處理!
[root@bogon ~]# expr 2 + 2
4
[root@bogon ~]# expr 2 - 2
0
[root@bogon ~]# expr 2 \* 2
4
//需要使用轉義符“\”
[root@bogon ~]# expr 2 / 2
1
在使用expr命令時:
- 運算符及用于就算的數字左右都至少有一個空格,否則會報錯;
- 使用星號時,必須使用轉義符“\”,否則shell會錯誤的理解星號的作用;
expr可配合變量進行計算,但需要用反引號將計算表達式括起來。比如:
[root@bogon ~]# i=5
[root@bogon ~]# i=`expr $i + 5`
//注意變量和數字兩邊要有空格
[root@bogon ~]# echo $i
10
原理:利用以expr做計算時變量或字符串必須是整數的原則,把一個變量或字符串和一個已知的整數(非0)相加,看命令執行的結果是否為0。如果是0,就認為做加法的變量或字符串為整數;反之則不是。比如:
[root@bogon ~]# i=5
[root@bogon ~]# expr $i + 6 &>/dev/null
[root@bogon ~]# echo $?
0
[root@bogon ~]# i=a
[root@bogon ~]# expr $i + 6 &>/dev/null
[root@bogon ~]# echo $?
2
腳本示例:
第一種:
[root@bogon ~]# vim test.sh
#!/bin/bash
expr $1 + 1 &> /dev/null
if [ $? -eq 0 ]
then
echo int
else
echo chars
fi
[root@bogon ~]# sh -x test.sh 12
+ expr 12 + 1
+ '[' 0 -eq 0 ']'
+ echo int
int
[root@bogon ~]# sh -x test.sh qq
+ expr qq + 1
+ '[' 2 -eq 0 ']'
+ echo chars
chars
第二種
[root@bogon ~]# vim test1.sh
#!/bin/bash
while true
do
read -p "Please input:" A
expr $A + 1 &>/dev/null
if [ $? -eq 0 ]
then
echo int
else
echo chars
fi
done
[root@bogon ~]# sh test1.sh
Please input:1
int
Please input:q
chars
//這樣的腳本是永遠等待輸入,并判斷;
//如果只希望判斷一次就結束,把while循環語句刪除即可!
[root@bogon ~]# a=dfdfdfdfdfd
[root@bogon ~]# expr length "$a"
11
[root@bogon ~]# echo ${#a}
11
[root@bogon ~]# echo ${a} | wc -L
11
[root@bogon ~]# echo ${a} | awk '{print length($0)}'
11
bc是Linux下的計算機,除了可以作為計算機來使用,還可以作為命令工具來使用!
bc命令作為計算機使用:
[root@bogon ~]# 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+2
3
bc命令在命令行進行計算:
[root@bogon ~]# echo 3+5 | bc
8
[root@bogon ~]# echo "scale=2;355/113"|bc
3.14
//使用scale=2保留兩位小數。
利用awk進行運算的效果也很好,適合小數和整數,特別是命令行計算,尤其是小數,運算很精確,好用。比如:
[root@bogon ~]# echo "1.2 1.3" | awk '{print $1+$2}'
2.5
[root@bogon ~]# echo "10 10" | awk '{print ($1+10)/$2}'
2
示例:
[root@bogon ~]# i=10
[root@bogon ~]# i=$[i+10] && echo $i
20
[root@bogon ~]# echo $[2*3]
6
[root@bogon ~]# echo $[2-3]
-1
這次就簡單介紹這么多!
———————— 本文至此結束,感謝閱讀 ————————
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。