一、shell條件測試 man bash //查看幫助
條件測試的命令
test 選項 文件名或目錄名
或
[ 選項 文件名或目錄名 ]
例:
[ -e /etc/passd ]
文件狀態
-f //判斷是不是文件,是文件爲真
-d //判斷是不是目錄,是目錄爲真
-e//判斷是不是存在,存在爲真
-r//判斷是否可以閱讀,可以閱讀爲真
-w//判斷是否可寫,可寫爲真
-x//判斷是否可執行,可執行爲真
-l//判斷是否爲鏈接,是鏈接爲真
數值比較(整數比較)
[ 數值1 選項 數值2 ]
或
test 數值1 選項 數值2
等於 -eq
不等於 -ne
小於 -lt
小於等於 -le
大於 -gt
大於等於 -ge
h
[ 字符選項比較 ]
等於 ==
不等於 !=
-z 字串爲空爲真
! -z 字串不爲空爲真
例:
[ $USER==root ] && echo "admin"
[ -z $w ]
邏輯比較(判斷時,是2個或2個以上條件時使用邏輯判斷)
邏輯與 && 或用 -a 多個條件要同時成立
邏輯或 || 或用 -o 或用多個條件只要有一個條件成立就可以
邏輯非 ! 取號 -z爲空 !-z 加了歎號也就是取反不爲空
[ 5 -gt 6 ] || [ 7 lt 8 ] || [ 0 -lt 1 ]
或
[ 5 -gt 6 -o 7 -lt 8 -o 0 -lt 1 ]
流程控制 是否執行 取決於條件判斷的判斷結果是否爲真。條件判斷結果爲真,
流程控制纔會執行,反之不會執行。對不同的對象做判斷,要用不同的判斷方式和選項
二、Shell運算符與運算命令
+ - * / %
++ --
+= -= *= /= %=
運算命令
expr 數值1 運算符 數值2
例1:
#!/bin/bash
#計算用戶從終端輸入的任意2個數的和
read -p "請輸入第一個數" num1
read -p "請輸入第二個數" num2
sum=`expr $num1 + $num2`
echo "$num1 + $num2 = $sum"
例2
expr 只能做整數運算 默認返回計算結果
#expr num1 + num2 - num3 \* num4 //乘號要做轉義
#expr 10 % 8
#a=10
#b=20
#sum=`expr $a + $b`
++ 自加運算 每次數字自動加1
-- 自減運算 每次數字自動減1
let 只做運算,不返回計算結果
let 變量運算符
i=1
let i++ //i=i+1
echo $i
j=10
let j-- //j=j-1
echo $j
+= -= *- /= %=
i=10
let i+=2 //i=i+2
echo $i
加法算的第二種運算方式 $(()) $[] 的使用
#echo $((10*30))
#x=10
#b=20
#echo $((x*y))
#echo $[10*30]
i=10
echo $((++i)) //先執行運算,後參與程序
i=10
echo $((i++)) //先參與程序,後執行運算
Shell裏的流程控制
選擇結構 if (只有條件判斷結果爲真時,才執行相應的操作)
單分支
if 條件
條件判斷成立時,要執行的操作
.......
fi
例:
read -p "please input ip address" addr
if [ -z $addr ];then
echo "你沒有輸入要ping的ip地址"
exit
fi
ping -c 3 $addr &> /dev/null
if [ $? -eq 0 ];then
echo "主機在線"
fi
echo "script over"
雙分支
if 條件測試命令;then
條件判斷成立時,要執行的操作
.........
else
條件判斷不成立時,要執行的操作
.........
fi
#!bin/bash
service sshd status &> /dev/null
if [ $? -eq 0 ];then
echo "sshd in running"
else
service sshd start
fi
多分支
if 條件測試命令1;then
條件測試成立時執行的命令序列
......
......
elif 條件測試命令2;then
條件測試成立時執行的命令序列
......
......
elif 條件測試命令3;then
條件測試3成立時執行的命令序列
......
......
elif 條件測試命令N;then
條件測試N成立時執行的命令序列
......
......
else
以上所有的條件判斷都成立時執行的命令
......
......
fi
循環結構(反覆執行相同操作時,使用循環結構)
for語法格式
for 變量名 in 變量值列表
do
當變量值列表有值賦給變量名時,執行的語句塊
......
.....
doneasswd
#!/bin/bash
#for i in 1 2 3 4 5
#for i in `seq 30 45`
#for i in `seq 254`
#for i in `seq 10 2 30`
#for i in {1..30}
#for i in {a..z}
for i in `head /etc/`
for i in `ls /shell/*.sh`
do
echo $i
done
while
C-for
until
分支結構 case (根據變量值的匹配結果執行相應的操作)