shell:數值運算、條件測試、if判斷

bash-completion包:支持tab補齊

數值運算:整數運算、小數運算
一、整數運算
1、expr
expr A + B,A和B之間要空格,否則直接顯示A+B
expr A - B
expr A * B #乘法需要採用轉義\,避免被作爲shell通配符
expr A / B
\:只能屏蔽一個字符e.g:
[root@shell ~]# a=24
[root@shell ~]# echo \$a
$a
[root@shell ~]# echo $a
24
[root@shell ~]# echo \$a$b
$a
[root@shell ~]# echo \$a\$b
$a$b

2、$[]或$(())
舉例:
[root@shell ~]# echo $[10*3]
30
[root@shell ~]# echo $[10/3]
3
[root@shell ~]# echo $[10+3]
13
[root@shell ~]# echo $[10-3]
7
[root@shell ~]# echo $[10%3]
1
[root@shell ~]# x=3
[root@shell ~]# y=5
[root@shell ~]# echo $[x+y]
8

可以一行進行多個運算
[root@shell ~]# x=8
[root@shell ~]# echo $[x+8],$[x*8]
[root@shell ~]# 16,64

3、let運算 不回顯結果
[root@shell ~]# x=9
[root@shell ~]# let x=x+8
[root@shell ~]# echo $x
17

4、特殊用法:
i=n
let i++ ---->i=n+1
let i-- ---->i=n-1
let i+=3 --->i=n+3
let i-=2 --->i=n-2
let i=2 --->i=n2
let i/=2 --->i=n/2
舉例:
[root@shell ~]# i=24
[root@shell ~]# let i++
[root@shell ~]# echo $i
25
[root@shell ~]# let i+=3
[root@shell ~]# echo $i
28
[root@shell ~]# let i-=1
[root@shell ~]# echo $i
27
[root@shell ~]# let i*=2
[root@shell ~]# echo $i
54
[root@shell ~]# let i/=2
[root@shell ~]# echo $i
27

二、小數運算
scale=n 控制小數點位數爲n位
舉例:
[root@shell ~]# bc
scale=5 #取小數點後保留5位
24/5.2555 #24除以5.2555
4.56659 #結果爲4.56659

bc可做數值大小比較>、<、==、>=、<=、!=,真爲1,假爲0
舉例:
[root@shell ~]# echo "1>2" | bc
[root@shell ~]# 0
[root@shell ~]# echo "2>1" | bc
[root@shell ~]# 1
[root@shell ~]# A=12.5;B=24.8
[root@shell ~]# echo "$A>$B" | bc
0

bc非交互式運算
[root@shell ~]# echo 'scale=4;12.34*56.789;5/3' | bc #一行可以有多個命令,用分號;隔開!
700.7762
1.666

三、條件測試操作
1、字符串比較:==(判斷兩個字符串是否相當)、-z(字符串的值是否爲空),-n(字符串的值是否不爲空,相當於! -z)
舉例:
判斷當前用戶是否爲root
當root用戶執行時:
[root@shell ~]# [ $USER == "root" ]
[root@shell ~]# echo $?
[root@shell ~]# 0
當普通用戶執行時:
[kobe@shell ~]$ [ $USER == "root" ]
[kobe@shell ~]$ echo $?
[kobe@shell ~]$ 1

且&&,或||
一行中有多個命令,A命令和B命令
A;B #執行A,執行B
A&&B #執行A,僅當A成功才執行B
A||B #執行A,僅當A失敗才執行B
舉例:
[ a == a ] && echo "yes" || echo "no"
yes
[ a == b ] && echo "yes" || echo "no"
no

[root@shell ~]# [ a == a ]
[root@shell ~]# echo $?
[root@shell ~]# 0
[root@shell ~]# [ -z $A ] #判斷A變量是否爲空
[root@shell ~]# echo $? #查看0爲真,非0爲假

[root@shell ~]# a="abc" ; b="" #定義變量a的值爲abc, b的值爲空,注意:""裏如果有空格也算不爲空
[root@shell ~]# [ -z "$a" ] && echo "空值" || echo "非空值"
非空值
[root@shell ~]# [ -z $b ] && echo "空值" || echo "非空值"
空值

2、整數比較(不支持小數比較) -eq(等於)、-ne(不相等)、-gt(大於)、-ge(大於等於)、-lt(小於)、-le(小於等於)
舉例:
[root@shell ~]# x=20
[root@shell ~]# [ $x -eq 20 ] && echo "相等" || echo "不相等"
相等
[root@shell ~]# [ $x -eq 30 ] && echo "相等" || echo "不相等"
不相等

提取當前登錄此虛擬機的用戶數,比較是否超過4
[root@shell ~]# who | wc -l
3 #統計用戶數爲3
[root@shell ~]# N=$(who | wc -l) #將統計的值賦給N
[root@shell ~]# [ $N --gt 4 ] && echo "超過了" || echo "沒超過"
沒超過

也可簡化爲:
[root@shell ~]# [ $(who | wc -l) -gt 4 ] && echo "超過了" || echo "沒超過"

3、文件、目錄判斷
-e #判斷是否存在(不管是文件還是目錄)
-f #判斷是否存在文件
-d #判斷是否存在目錄
-r #判斷是否有r權限
-w #判斷是否有w權限
-x #判斷是否有x權限

舉例:
[root@shell ~]# [ -e "/usr/src" ] && echo 存在 || echo 不存在
存在

判斷對象是否爲目錄 -d,是否不爲目錄 ! -d
[root@shell ~]# [ -d "/usr/src/" ] && echo "是目錄" || echo "不是目錄"
是目錄
[root@shell ~]# [ -d "/etc/fstab" ] && echo "是目錄" || echo "不是目錄"
不是目錄
[root@shell ~]# [ -d "/home/nooby" ] && echo "是目錄" || echo "不是目錄"
不是目錄

判斷對象是否有-r、-w、-x權限
注意:r和w對root用戶判斷無效,無論是否設置權限,root都可讀或寫
舉例:
[root@shell ~]# cp install.log /tmp/t.txt #複製一個文件做測試
[root@shell ~]# chmod -r /tmp/t.txt #去掉所有的r權限
[root@shell ~]# [ -r "/tmp/t.txt" ] && echo "可讀" || echo "不可讀" #root仍然可讀
可讀

切換爲普通用戶時:
[kobe@shell ~]$ [ -r "/tmp/t.txt" ] && echo "可讀" || echo "不可讀"
不可讀

普通用戶只對自己擁有r權限的對象,-r測試才成立
[kobe@shell ~]$ ls -l .bashrc
-rw-r--r-- 1 kobe kobe 124 09-24 16:44 .bashrc
[kobe@shell ~]$ [ -r ".bashrc" ] && echo "可讀" || echo "不可讀"
可讀

-x權限:取決於文件本身,root或普通用戶都適用
[root@shell ~]# chmod 644 /tmp/t.txt #設置無x權限
[root@shell ~]# ls -l /tmp/t.txt
-rw-r--r-- 1 root root 33139 12-11 10:52 /tmp/t.txt
[root@shell ~]# [ -x "/tmp/t.txt" ] && echo "可執行" || echo "不可執行"
不可執行
[root@shell ~]# chmod +x /tmp/t.txt #添加x權限
[root@shell ~]# [ -x "/tmp/t.txt" ] && echo "可執行" || echo "不可執行"
可執行

條件組合應用:
當前用戶爲root,且位於/root目錄下
[root@shell ~]# [ $USER == "root" ]&&[ $PWD == "/root"]
[root@shell ~]# [ $? -eq 0 ]&& echo "YES"
YES

[root@shell ~]# [ ! -d "/xx" ]&& mkdir /xx #判斷是否沒有目錄/xx,是就創建
[root@shell ~]# mount /dev/cdrom /xx #掛載

[root@shell ~]# [ -d "/xx" ]|| mkdir /xx #判斷是否有目錄/xx,沒有就創建
[root@shell ~]# mount /dev/cdrom /xx

[root@shell ~]# [ -d "/xx" ]&& mount /dev/cdrom /xx


每分鐘檢測當前計算機登錄的用戶數量
若數量大於2,則發送郵件報警
先寫好腳本:
#!/bin/bash
user=$(who | wc -l)
[ $user -ge 2 ] && mail -s "登陸用戶過多" root < /root/用戶報警.txt

crontab -e -u root
/1 * bash 腳本名


if判斷語句

1、單分支if(僅判斷對)
if [ 判斷 ];then
命令
fi

if [ 判斷 ];then
成功
else
失敗
fi

舉例:
腳本:
#!/bin/bash
read -p '請輸入您的IP:' ip
ping -c2 $ip >&/dev/null #-c2是隻ping2個包,-i0.1(縮短髮送每個包的間隔時間爲0.1秒),-W2(等待反饋是否ping通的超時時間2秒)
if [ $? -eq 0 ];then
echo 通了!
else
echo 不通!
fi

2、多分支if
if [ 判斷1 ];then
命令
elif [ 判斷2 ];then
命令
... ...
else
命令
fi

舉例:
$RANDOM(隨機數)
$[RANDOM%10+1] 求餘(因爲餘數不可能大於除數)設定隨機數的範圍1-10,不能用%11,因爲有可能全部除盡餘數爲0
#!/bin/bash
x=$[RANDOM%10+1]
read -p "我有個1-10的隨機數,你猜:" cai
if [ $cai -eq $x ];then
echo 恭喜你,猜對了!
exit #必須要有!不然猜對了還會繼續猜下去
elif [ $cai -gt $x ];then
echo 太大了
else
echo 太小了
fi
增加概率可以從read開始到最後多複製幾遍

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章