文章目錄
- 一、條件測試
-
- 1.1 檔案測試與整數測試
-
- 1.1.1 條件測試操作
- 1.2 一進制運算符,二進制運算符和三元運算符
- 二、if 語句
-
- 2.1 if 單分支語句
- 2.2 if 雙分支語句
- 2.3 if 多分支語句
- 三、case分支語句
-
- 1.1 case語句的結構
- 1.2 case語句的執行個體
-
- 1.2.1 建立一個判斷輸入類型的腳本
一、條件測試
1.1 檔案測試與整數測試
1.1.1 條件測試操作
test指令
-
測試特定的表達式是否成立,當條件成立時,測試語句的傳回值為0,否則為其他數值
格式一:test 條件表達式
格式二:[ 條件表達式 ] (兩端要有空格,此法更為常用)
檔案測試
[ 操作符 檔案或目錄 ] ‘注意兩端空格’
常見的測試操作符
- -d 測試是否為目錄(directory)
- -e 測試目錄或檔案是否存在(Exist)
- -f 測試是否為檔案(File)
- -r 測試目前使用者是否有權限讀取(Read)
- -w 測試目前使用者是否有權限寫入(Write)
- -x 測試目前使用者是否有權限執行(eXcute)
[[email protected] opt]# cd aaa
[[email protected] aaa]# ls
[[email protected] aaa]# mkdir ccc
[[email protected] aaa]# ls
ccc
[[email protected] aaa]# test -d ccc
[[email protected] aaa]# echo $? '&? 傳回0表示條件成立,傳回非零值表示條件不成立'
0
[[email protected] aaa]# test -f ccc
[[email protected] aaa]# echo $?
1
[[email protected] aaa]# touch bbb.txt
[[email protected] aaa]# ls
bbb.txt ccc
[[email protected] aaa]# test -f bbb.txt
[[email protected] aaa]# echo $?
0
[[email protected] aaa]# [ -d ccc ]
[[email protected] aaa]# echo $?
0
[[email protected] aaa]# [ -x ccc ]
[[email protected] aaa]# echo $?
0
[[email protected] aaa]# ls -l
total 0
-rw-r--r--. 1 root root 0 Nov 26 15:18 bbb.txt
drwxr-xr-x. 2 root root 6 Nov 26 15:17 ccc
[[email protected] aaa]# useradd lisi
[[email protected] ~]# echo "123123" | passwd --stdin lisi
更改使用者 lisi 的密碼 。
passwd:所有的身份驗證令牌已經成功更新。
[[email protected] ~]# su - lisi
最後一次失敗的登入:二 11月 26 15:28:39 CST 2019pts/0 上
最有一次成功登入後有 1 次失敗的登入嘗試。
[[email protected] aaa]$ [ -w ccc ]
[[email protected] aaa]$ echo $?
1
[[email protected] aaa]$ [ -r ccc ]
[[email protected] aaa]$ echo $?
0
[[email protected] aaa]$ [ -r ccc ] && echo "yes" '&& 邏輯與,"而且"的意思'
yes
[[email protected] aaa]$ [ -w ccc ] && echo "yes"
[[email protected] aaa]$
[[email protected] aaa]$ [ -w ccc ] || echo "yes" '|| 邏輯或,"或者"的意思'
yes
[[email protected] opt]# [ -e /dev/cdrom ] && echo "yes"
yes
[[email protected] opt]# test -e /dev/cdrom && echo "yes"
yes
整數值比較
[ 整數1 操作符 整數2 ]
- 常用的測試操作符
- -eq 等于(Equal)
- -ne 不等于(Not Equal)
- -gt 大于(Greater Than)
- -lt 小于(Lesser Than)
- -le 小于或等于(Lesser or Equal)
- -ge 大于或等于(Greater or Equal)
數值比較就用-eq
字元串比較用==
[[email protected] aaa]$ [ 5 -gt 3 ] && echo "yes"
yes
[[email protected] aaa]$ [ 5 -gt 6 ] && echo "yes"
[[email protected] aaa]$ [ 5 -le 6 ] && echo "yes"
yes
[[email protected] aaa]$ [ 5 -le 3 ] && echo "yes"
[[email protected] opt]# who | wc -l
2
[[email protected] opt]# [ $(who|wc -l) -lt 5 ]&& echo "yes" '測試使用者數是否大于5'
yes
[[email protected] opt]# free -m '看記憶體參數 free -m'
total used free shared buff/cache available
Mem: 3771 719 2396 17 655 2725
Swap: 2047 0 2047
[root@localhost opt]# FreeCC=$(free -m | grep "Mem:" | awk '{print $4}')
[[email protected] opt]# [ $FreeCC -gt 1000 ]&& echo "$FreeCC"MB '空閑記憶體是否大于1000MB'
2396MB
[[email protected] opt]# [ $FreeCC -gt 1000 ]&& echo "$FreeCC MB" '另一種表示'
2396 MB
[root@localhost opt]# [ $FreeCC -gt 1000 ]&& echo ${FreeCC}MB '{}裡面是變量'
2396MB
字元串比較
-
格式一:
[ 字元串1 = 字元串2 ]
[ 字元串1 != 字元串2 ]
-
格式二:
[ -z 字元串 ]
常用的測試操作符
- = 第一個字元串與第二個字元串内容相同
- != 第一個字元串與第二個字元串内容不同,!号表示相反的意思
- -z 檢查字元串内容是否為空,對于未定義或賦予空值的變量将視為空串
[[email protected] opt]# [ $LANG != "en_US" ] && echo "yes"
yes
[[email protected] opt]# [ $LANG = "en_US" ] && echo "yes"
[[email protected] opt]# [ "男" = "男" ] && echo "yes"
yes
[[email protected] opt]# [ "男" != "男" ] && echo "yes"
[[email protected] opt]# [ "男" != "女" ] && echo "yes"
yes
[[email protected] opt]# [ "男" = "女" ] && echo "yes"
[[email protected] opt]# vim 33.sh
#!/bin/bash
read -p "是否建立/opt/share目錄:(yes/no)" ack
[ $ack = yes ] && mkdir /opt/share
echo "建立成功"
[[email protected] opt]# ./33.sh
是否建立/opt/share目錄:(yes/no)yes
建立成功
[[email protected] opt]# ls
33.sh rh share
[[email protected] opt]# vim 44.sh
#!/bin/bash
[ -d /opt/demo ] && echo "已經存在" || mkdir /opt/demo && echo "建立成功"
[[email protected] opt]# ./44.sh
建立成功
[[email protected] opt]# ls
33.sh rh share 44.sh demo
[[email protected] opt]# echo $LANG
zh_CN.UTF-8
[[email protected] opt]# [ $LANG != "EN" ]&&echo "no" '兩個字元串不相等'
no
[[email protected] opt]# [ -z '' ]&&echo "no" '判斷是否為空'
no
[[email protected] opt]# vim 33.sh
#!/bin/bash
read -p "是否建立/opt/share目錄:(yes/no)" ack
[ $ack = yes ] && mkdir /opt/share
echo "建立成功"
[[email protected] opt]# ./33.sh
是否建立/opt/share目錄:(yes/no)yes
建立成功
[[email protected] opt]# ls
33.sh rh share
[[email protected] opt]# vim 44.sh
#!/bin/bash
[ -d /opt/demo ] && echo "已經存在" || mkdir /opt/demo && echo "建立成功"
[[email protected] opt]# ./44.sh
建立成功
[[email protected] opt]# ls
33.sh rh share 44.sh demo
邏輯測試
基本格式
格式一: [ 表達式1 ] 操作符 [ 表達式2 ] …
格式二: 指令1 操作符 指令2 …
常用的測試操作符
- -a或&& 邏輯與,“而且”的意思,使用test指令測試時,可将“&&”改為“-a”
- -o或|| 邏輯或,“或者”的意思,使用test指令測試時,可将“||”改為“-o”
- ! 邏輯否
[[email protected] opt]# [ -d /opt/demo ] && echo "yes"
yes
[[email protected] opt]# [ ! -d /opt/demo ] && echo "yes"
[[email protected] opt]# [ 1 -eq 1 ] && [ 2 -eq 2 ] && echo "yes"
yes
[[email protected] opt]# [ 1 -eq 1 -a 2 -eq 2 ] && echo "yes" '-a和-o也可使用在[]中,更加友善'
yes
1.2 一進制運算符,二進制運算符和三元運算符
一進制運算符
- 帶一進制運算符的表達式遵循從右到左的結合性,常見的一進制表達式:++一進制表達式,–一進制表達式
- 字首自增運算符與字首自減運算符
- 在一進制表達式的前面添加運算符++或–後得到的表達式是一個一進制表達式。操作數将被加1(++)或減1(–),表達式的值是經過加1、減1 以後的值。操作數必須是一個左值。
-
i=1;
i++: i=$i+1
i=i++:先指派在運算
i=++i:先自加在指派
i=–i:先自減在指派
[[email protected] opt]# i=1
[[email protected] opt]# echo $i
1
[[email protected] opt]# let i=++i
[[email protected] opt]# echo $i
2
[[email protected] opt]# let i+=2 '相當于i=i+2'
[[email protected] opt]# echo $i
4
二進制運算符
- a + b = c
三元運算符
- 條件&&結果1 || 結果2
二、if 語句
2.1 if 單分支語句
單分支結構
單分支結構(基本格式)
if 條件測試操作
then 指令序列
fi
單分支結構(舉例)
if 磁盤已用空間>80%
then 報警
fi
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2csYmTXVWNOdVZqx2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL1gTOzEDM1MjM5EzNwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
- exit 1 異常退出
- exit 0 正常退出
[[email protected] opt]# vim eee.sh
#!/bin/bash
dir "/opt/demo02"
if [ ! -d $dir ] '若不存在/opt/demo2,則執行下述指令'
then
mkdir -p $dir
echo "$dir建立成功"
fi
[[email protected] opt]# chmod +x eee.sh
[[email protected] opt]# ./eee.sh
/opt/demo02建立成功
2.2 if 雙分支語句
雙分支結構(基本格式)
if 條件測試操作
then 指令序列1
else 指令序列2
fi
雙分支結構(舉例)
if 80端口是否在監聽
then 網站服務已在運作
else 啟動httpd服務
fi
例一:
[[email protected] opt]# vim eee.sh
#!/bin/bash
dir="/opt/demo02"
if [ ! -d $dir ]
then
mkdir -p $dir
echo "$dir建立成功"
else
echo "$dir已存在"
fi
[[email protected] opt]# ./eee.sh
/opt/demo02已存在
例2:檢視目标主機是否存活,顯示檢測結果
[[email protected] opt]# vim fff.sh
#!/bin/bash
read -p "請輸入IP位址:" addr
ping -c 3 -i 0.2 -W 3 $addr &> /dev/null
if [ $? -eq 0 ]
then
echo "$addr is up"
else
echo "$addr is down"
fi
[[email protected] opt]# chmod +x fff.sh
[[email protected] opt]# ./fff.sh
請輸入IP位址:192.168.100.1
192.168.100.1 is down
[[email protected] opt]# ./fff.sh
請輸入IP位址:192.168.197.1
192.168.197.1 is up
其中:
-c:發送三個包
-i: 發包廂隔0.2秒
-W:等待時間3秒
2.3 if 多分支語句
多分支結構(基本格式)
if 條件測試操作1
then 指令序列1
elif 條件測試操作2
then 指令序列2
else
指令序列3
fi
多分支結構(舉例)
if 分數為85~100之間
then 判為優秀
elif 分數為70~84之間
then 判為合格
else
判為不合格
fi
舉例:判斷分數範圍,分數優秀,合格,不合格三擋
[[email protected] opt]# vim ggg.sh
#!/bin/bash
read -p "請輸入成績:" score
if [ $score -lt 0 ] || [ $score -gt 100 ]
then
echo "輸入有誤"
exit 1;
elif [ $score -ge 85 ] && [ $score -le 100 ]
then
echo "成績優秀"
elif [ $score -ge 70 ] && [ $score -le 84 ]
then
echo "成績合格"
else
echo "成績不合格"
fi
[[email protected] opt]# ./ggg.sh
請輸入成績:100
成績優秀
[[email protected] opt]# ./ggg.sh
請輸入成績:82
成績合格
[[email protected] opt]# ./ggg.sh
請輸入成績:53
成績不合格
[[email protected] opt]# ./ggg.sh
請輸入成績:111
輸入有誤
[[email protected] opt]# ./ggg.sh
請輸入成績:-23
輸入有誤
三、case分支語句
1.1 case語句的結構
- 針對變量的不同取值,分别執行不同的指令序列
- 這種情況與多分支的if語句非常相似,隻不過if語句需要判斷多個不同的條件,而case語句訓示判斷一個變量的不同取值
格式:
case 變量值 in
模式1)
指令序列1
;;
模式2)
指令序列2
;;
....
*)
預設指令序列
esac
執行個體:
case 控制指令 in
start)
啟動XX服務
;;
stop)
停止XX服務
;;
....
*)
顯示服務腳本的用法
esac
case比對一個區間範圍
往往用于列出菜單
1:
2:
3:
會用于寫服務啟動腳本
/etc/init.d/network
1.2 case語句的執行個體
1.2.1 建立一個判斷輸入類型的腳本
- 提示使用者輸入一個字元
- 判斷出該字元是字母,數字或者其他字元
- case 後面的雙引号可以去掉
- $後面 加個大括号,友善閱讀。
[[email protected] opt]# vim panduan.sh
#!/bin/bash
read -p "請輸入一個字元:" aa
case "$aa" in
[0-9])
echo "你輸入的是數字"
;;
[a-z]|[A-Z])
echo "你輸入的是字母"
;;
*)
echo "你輸入的是符号"
esac
~
[[email protected] opt]# chmod +x panduan.sh
[[email protected] opt]# ./panduan.sh
請輸入一個字元:3
你輸入的是數字
[[email protected] opt]# ./panduan.sh
請輸入一個字元:e
你輸入的是字母
[[email protected] opt]# ./panduan.sh
請輸入一個字元:#
你輸入的是符号
'男女組賽跑,10秒進決賽判斷'
[[email protected] opt]# vim bak.sh
[[email protected] opt]# vim saipao.sh
#!/bin/bash
read -p "請輸入性别:" sex
read -p "請輸入成績:" score
case $score in
[0-9]|10)
echo "進入決賽,是$sex組"
;;
*)
echo "淘汰"
esac
[[email protected] opt]# chmod +x saipao.sh
[[email protected] opt]# ./saipao.sh
請輸入性别:男
請輸入成績:18
淘汰
[[email protected] opt]# ./saipao.sh
請輸入性别:男
請輸入成績:8
進入決賽,是男組
[[email protected] opt]# ./saipao.sh
請輸入性别:女
請輸入成績:9
進入決賽,是女組
[[email protected] opt]# ./saipao.sh
請輸入性别:12
[[email protected] opt]# ./saipao.sh
請輸入性别:女
請輸入成績:12
淘汰
随機值:echo $RANDOM
[[email protected] opt]# echo $RANDOM
27715
[[email protected] opt]# echo $RANDOM
13611
[[email protected] opt]# echo $RANDOM
17975
0-10的随機值:
[[email protected] opt]# echo $[$RANDOM%10]
4
[[email protected] opt]# echo $[$RANDOM%10]
1
[[email protected] opt]# echo $[$RANDOM%10]
2