Linux bash中的運算


  1. 第一種,使用((表達式)) 或$((表達式)),如果用單小括號,代表包含的是系統命令

root@root:~# a=3
root@root:~# ((b=a+3))
root@root:~# echo $b
6
root@root:~# a=1
root@root:~# b=2
root@root:~# echo $(($a+$b))
3
root@root:~# echo $((3*(6%4)))
6
root@root:~# echo $((1 &&0))
0

  1. 第二種使用let

root@root:~# let "c=$a+4"
root@root:~# echo $c
7

  1. 使用expr表達式,注意空格和反引號

root@root:~# d=`expr 4 + 3`
root@root:~# echo $d
7
root@root:~# a=1
root@root:~# b=2
root@root:~# c=$(expr $a + $b) #注意+ 號左右兩邊必須有空格才有效
root@root:~# echo $c
3

  1. 放在$[ expression]中,這是bash的推薦的標准處理方法

root@root:~# a=4
root@root:~# b=$[$a-9]
root@root:~# echo $b
-5

  1. 在C風格的for循環中,則可以如下使用

root@root:~# for((a=1,b=10;a<=10;a++,b--))
do
((c=a*b))
echo "$c"
done
10
18
24
28
30
30
28
24
18
10

  1. 浮點數運算,借助bc(bash計算器)運算

基本格式: variable=`echo "option;expression" | bc`
root@root:~# a=`echo "scale=4;3.25/3" | bc`
root@root:~# echo $a
1.0833
root@root:~# a=6.6
root@root:~# b=3.5
root@root:~# c=`echo "scale=5;$a/$b"|bc`
root@root:~# echo $c
1.88571

  1. 如果浮點表達是有多行,則可以放在多行計算

基本格式:
variable=`bc << EOF
options
statements
expressions
EOF
`
演示:
root@root:~# a=1.2
root@root:~# b=2.4
root@root:~# c=3.5
root@root:~# d=2
root@root:~# e=`bc << EOF
scale=4
ab=($a+$b)
cd=($c-$d)
ab+cd
EOF
`
root@root:~# echo $e
5.1

  1. Shell中的變量默認都是字符串,可以看到

root@root:~# a=1
root@root:~# b=2
root@root:~# c=$a+$b
root@root:~# echo $c
1+2

  1. bash腳本中使用declare 聲明變量

基本格式: declare [+/-] [選項] 變量名
選項:
    - :給變量設定類型屬性

    + :取消變量的類型屬性

    -i :將變量聲明為整數型(int)

    -x :將變量聲明為環境變量

    -p :顯示指定變量的被聲明的類型
#!bin/bash
a=1
b=2
c=$a+$b
declare -p a #此步輸出 declare -- a="1"
export a
declare -p a #此步輸出 declare -x a="1" a已為環境變量
declare -i c=$a+$b
echo $c #輸出結果3
root@root:~# bash cmd
declare -- a="1"
declare -x a="1"
3
root@root:~# num=2+3
root@root:~# declare -i num #將num變量數值化
root@root:~# echo $num
2+3
root@root:~# num=9/4
root@root:~# echo $num
2
root@root:~# num=ok #賦值字符串,無法計算,結果為0
root@root:~# echo $num
0

  1. 基本與或非運算,冪運算,模運算

root@root:~# echo $[ 2>>1 ] #右移
1
root@root:~# echo $[ 2<<1 ] #左移
4
對~8按位取反步驟
轉二進制:0 1000
計算補碼:0 1000
按位取反:1 0111
轉為原碼:
按位取反:1 1000
末位加一:1 1001
符號位為1是負數,即-9
root@root:~# echo $[ ~8 ] #按位非
-9

root@root:~# echo $((1^0)) #異或
1
root@root:~# echo $((1^1))
0
root@root:~# echo $((2 & 5)) #按位與
0
root@root:~# echo $((2 && 5)) #邏輯與
1
root@root:~# echo $((2 | 5)) #按位或
7
root@root:~# echo $((2 || 5)) #邏輯或
1
root@root:~# echo $[!2] #非運算
0
root@root:~# echo $[!0]
1
root@root:~# expr 9 \| 3 #兩者都不為0,取前者,退出狀態碼為 0
9
root@root:~# expr 3 \| 9
3
root@root:~# expr 0 \| 0 #都為0,取0,退出狀態碼為 1
0
root@root:~# expr 0 \| 5 #取不為0的值,退出狀態碼0
5
root@root:~# expr 5 \| 0
5
root@root:~# expr 9 \& 3 #兩者都不為0,取前者,退出狀態碼為 0
9
root@root:~# expr 3 \& 9
3
root@root:~# expr 0 \& 0 #有一個為0,則結果為0,退出狀態碼1
0
root@root:~# expr 111 \& 0
0
root@root:~# expr 0 \& 111
0
root@root:~# expr 9 \< 9 #關系為假,結果為0
0
root@root:~# expr 8 \>= 3 * 3
0
root@root:~# expr 8 \> 2 * 3
1
root@root:~# expr -45 / 11 = -4 #一個等號和兩個等號都是判斷左右是否相等
1
root@root:~# expr 9 != 3 #邏輯結果為1,退出狀態碼0
1
root@root:~# expr 9 != 7 + 2 #邏輯結果為0,退出狀態碼1
0
root@root:~# expr 9 = 3 * 3 #邏輯結果為1,退出狀態碼0
1
root@root:~# echo $((4%6)) #模運算
4
root@root:~# echo $((2**3)) #冪運算
8

  1. 隨機數,$RANDOM不是一個變量,是一個內置函數

root@root:~# shuf -i 1-10 -n 3
7
5
2
root@root:~# shuf -i 100-1000 -n 3
991
189
487
root@root:~# echo $RANDOM
27727
root@root:~# echo $RANDOM
25622

  1. 條件判斷

test 等同於 [ ] , -gt 大於,-lt 小於, -eq 等於 , -ne 不等於 , -ge 大於等於, -le 小於等於
root@root:~# test 2 -gt 3
root@root:~# echo $?
1
root@root:~# test 34 -lt 91
root@root:~# echo $?
0
root@root:~# read a b
1 1
root@root:~# if [ $a == $b ]; then echo '倆數相等';fi
倆數相等
root@root:~# read a b
1 2
root@root:~# if [ $a -le $b ] ;then echo 'a 小於等於b';fi
a 小於等於b
root@root:~# read a b
1 '1'
root@root:~# if [ $a = $b ] ;then echo '倆數相等';else echo '倆數不等';fi
倆數不等
判斷文件
-d 判斷是否是目錄,-e判斷文件是否存在,-r判斷文件是否可讀,-w判斷文件是否可寫,-x判斷文件是否可執行
-f判斷是否普通文件,-s判斷文件大小不為0,-o 或邏輯判斷,-a 與邏輯判斷,-O 是否是文件的擁有者(不能在雙中括號中使用)
root@root:~# ls
baidunetdisk Desktop kali-sh.tar Public Videos
baidunetdiskdownload Documents Music src workspace
cmd Downloads Pictures Templates
root@root:~# [ -e cmd ] ; echo $?
0
root@root:~# test -d Downloads ; echo $?
0
root@root:~# test -d cmd; echo $?
1
root@root:~# [ -O cmd ] ;echo $?
0
root@root:~# [ -e cmd -o -e xxx ] ;echo $?
0
root@root:~# [ -e cmd -a -e xxx ] ; echo $?
1
判斷字符串
-eq 等於, -ne 不等於,-n 長度不為0,-z長度為0
root@root:~# read a

root@root:~# echo $a #引用變量加雙引號

root@root:~# if [ -n $a ]; then echo '長度不為0';else echo '長度為0';fi
長度不為0
root@root:~# if [ -n "$a"]; then echo '長度不為0' ; else echo '長度為0';fi
長度不為0
root@root:~# if [ "$a" ] ; then echo '不為空' ; else echo '為空'; fi
為空
root@root:~# read a
abcd
root@root:~# if [ "$a" ] ;then echo '不為空';else echo '為空';fi
不為空
[[ ]]中括號比較高級的用法,難用...
-gt 大於,-lt 小於,-ge 大於等於,-le 小於等於, -eq 等於,-ne 不等於
-n 長度不為0 , -z 長度為0, && 邏輯與,|| 邏輯或
root@root:~# [[ 23 < 123 ]] ; echo $?
1
root@root:~# [[ 23 < 24 ]] ; echo $?
0
root@root:~# a=1;b=2;c=1
#不加$符號也可以比較,盡量加上,雙引號也盡量加上
root@root:~# [[ a < b ]] ;echo $?
0
root@root:~# [[ a > b ]] ; echo $?
1
root@root:~# [[ $a < $b ]] ; echo $?
0
root@root:~# [[ $a > $b ]] ; echo $?
1
root@root:~# [[ $a <= $b ]]; echo $? #這種寫法報語法錯誤,單中括號也不能使用
bash: 條件表達式中有語法錯誤
bash: '$b' 附近有語法錯誤

root@root:~# [[ $a -lt $b ]]; echo $?
0
root@root:~# [[ $a -le $b ]]; echo $?
0
root@root:~# [[ $a = $b ]]; echo $?
1
root@root:~# [[ $a == $c ]]; echo $?
0
root@root:~# [[ $a -eq $c ]]; echo $?
0
root@root:~# [[ $a != $c ]]; echo $?
1
root@root:~# [[ $a -ne $c ]]; echo $?
1
root@root:~# [[ -n $a ]]; echo $?
0
root@root:~# declare d
root@root:~# [[ -n $d ]]; echo $?
1
root@root:~# [[ -z $d ]]; echo $?
0

root@root:~# a=mysql
root@root:~# [[ $a = mysq? ]]; echo $? #可以使用?號通配符,其它的不能使用
0
root@root:~# [[ $a == mysq? ]]; echo $?
0
root@root:~# [[ $a -eq mysql ]]; echo $? #不可以使用-eq判斷非數值,以下測試都為0
0
root@root:~# [[ $a -eq mysqld ]]; echo $?
0
root@root:~# [[ $a -eq dmysql ]]; echo $?
0
root@root:~# [[ $a = worl? ]]; echo $?
1
root@root:~# [[ -n $a && 3 > 2 ]]; echo $? #邏輯與
0
root@root:~# [[ -n $a && 3 = 2 ]]; echo $?
1
root@root:~# [[ -n $a || 3 = 2 ]]; echo $? #邏輯或
0
=~ 匹配正則表達式,前者包含后者,表達式為真
^ 匹配開頭,$匹配結尾
+匹配一個或多個字符, ?匹配0個或1個字符,.匹配一個字符

root@root:~# a=myddddd
root@root:~# if [[ $a =~ ^myd+ ]]; then echo 'ok';else echo 'no';fi
ok
root@root:~# if [[ $a =~ ^myd ]]; then echo 'ok';else echo 'no';fi
ok
root@root:~# if [[ $a =~ yd ]]; then echo 'ok';else echo 'no';fi
ok
root@root:~# if [[ $a =~ yds ]]; then echo 'ok';else echo 'no';fi
no
root@root:~# [[ helloword =~ word$ ]];echo $?
0
root@root:~# [[ helloword =~ wor$ ]];echo $?
1
root@root:~# [[ abc =~ a.c ]]; echo $?
0
root@root:~# [[ abc =~ a.d ]]; echo $?
1


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM