目錄
測試
?test測試文件的表達式 是否成立
格式
選項
比較整數數值
格式
選項
字符串比較
常用的測試操作符
格式
邏輯測試
格式
且 (全真才為真)
或 (一真即為真)
常見條件
雙中括號
[[ expression ]] 用法
( ){ }? 可以將多個命令組合在一起,批量執行
if語句的結構
分支結構
單分支
雙分支
多分支
舉例
單分支
判斷是否為超級管理員
?編輯
判斷主機連通性
多分支
考試成績
case
格式
字符
例子
考試成績
石頭剪刀布
echo
date
seq?
測試
?test測試文件的表達式 是否成立
格式
1.test? 條件表達式
2. [ 條件表達式?]? (注意[ ]空格,否則會失敗)
3.[ 操作符 文件或目錄 ]
選項
-d:測試是否為目錄(Directory)
[root@localhost ~]# test -d /etc/
[root@localhost ~]# echo $?
0
-e:測試目錄或文件是否存在(Exist)
[root@localhost ~]# test -e /etc
[root@localhost ~]# echo $?
0
[root@localhost ~]# test -e /fwf
[root@localhost ~]# echo $?
1
-a:測試目錄或文件是否存在(Exist)?
[root@localhost ~]# test -a /etc
[root@localhost ~]# echo $?
0
[root@localhost ~]# test -a /fwf
[root@localhost ~]# echo $?
1
?a和e的區別在于a不可以取非
[root@localhost ~]#[ ! -e /etc/shadow ]
[root@localhost ~]#echo $?
1
[root@localhost ~]#[ ! -a /etc/shadow ]
[root@localhost ~]#echo $?
0
-f:測試是否為文件(File)
[root@localhost ~]# test -f /etc/init.d
[root@localhost ~]# echo $?
1
[root@localhost ~]# test -f /etc/yum.conf
[root@localhost ~]# echo $?
0
-r:測試當前用戶是否有權限讀取(Read)
-w:測試當前用戶是否有權限寫入(Write)
-x:測試當前用戶是否有權限執行(eXcute)
root執行權限別人沒有root也沒有,別人有root也有
[root@localhost 123]# ll /etc/shadow
----------. 1 root root 1266 11月 8 13:21 /etc/shadow
[root@localhost 123]# [ -r /etc/shadow ]
[root@localhost 123]# echo $?
0
#實際效果,不是表面顯示,注意root權限
[root@localhost 123]# [ -x /etc/shadow ]
[root@localhost 123]# echo $?
1
#root執行權限別人沒有root也沒有,別人有root也有
[root@localhost 123]#
-L: 測試是否為軟連接文件
[root@localhost /]# test -L /etc/localtime
[root@localhost /]# echo $?
0
[root@localhost /]# test -L /etc/yum.conf
[root@localhost /]# echo $?
1
[root@localhost /]#
測試是否成功使用 $? 返回值(0為正確,非0不正確)
比較整數數值
格式
[ 整數1 -操作符 整數2 ] 公式
選項
-eq:第一個數等于(Equal)第二個數
-ne:第一個數不等于(Not Equal)第二個數
-gt:第一個數大于(Greater Than)第二個數
-lt:第一個數小于(Lesser Than)第二個數
-le:第一個數小于或等于(Lesser or Equal)第二個數
-ge:第一個數大于或等于(Greater or Equal)第二個數
[root@localhost /]# a=6
[root@localhost /]# b=9
[root@localhost /]# [ $a -eq $b ]
[root@localhost /]# echo $?
1
[root@localhost /]# [ $a -le $b ]
[root@localhost /]# echo $?
0
[root@localhost /]#
字符串比較
常用的測試操作符
=:字符串內容相同
!=:字符串內容不同,! 號表示相反的意思
-z:字符串內容為空
-n: 字符是否存在
格式
[ 字符串1 = 字符串2 ] 是否相同
[root@localhost /]# qwe=xuyucheng
[root@localhost /]# rty=taishuail
[root@localhost /]# [ $qwe = $rty ]
[root@localhost /]# echo $?
1
[root@localhost /]# rty=xuyucheng
[root@localhost /]# [ $qwe = $rty ]
[root@localhost /]# echo $?
0
[root@localhost /]#
[ 字符串1 != 字符串2 ] 是否不相同
[root@localhost /]# qwe=xuyucheng
[root@localhost /]# rty=taishuail
[root@localhost /]# [ $qwe != $rty ]
[root@localhost /]# echo $?
0
[ -z 字符串 ] 是否為空
[root@localhost /]# rty=taishuail
[root@localhost /]# [ -z $rty ]
[root@localhost /]# echo $?
1
[root@localhost /]# rty=" "
[root@localhost /]# [ -z $rty ]
[root@localhost /]# echo $?
0
[root@localhost /]#
[ -n 字符串 ] 字符是否存在
邏輯測試
格式
1.? [ 表達式1 ] 操作符 [ 表達式2 ] ...
2.? ?命令1 操作符 命令2 ...
且 (全真才為真)
第一個要真 第二 個也要真 才能是真
如果第一個為假 ,整個 就為假 不用執行下個操作
cmd1 && cmd2
或 (一真即為真)
如果第一個 為真 那么 不用執行第二個
第一個為假 ,才需要執行第二個
cmd1 || cmd2
常見條件
-a或&&:邏輯與,“而且”的意思全真才為真
-o或||:邏輯或,“或者”的意思一真即為真
!:邏輯否
雙中括號
[[ expression ]] 用法
== 左側字符串是否和右側的PATTERN相同
?注意:此表達式用于[[ ]]中,PATTERN(元字符)為通配符
=~ 左側字符串是否能夠被右側的正則表達式的PATTERN所匹配
?注意: 此表達式用于[[ ?]]中;擴展的正則表達式
[root@localhost ~]# xuc=tre.log
[root@localhost ~]# [[ "$xuc" == *.log ]] //是否有.log結尾的
[root@localhost ~]# echo $?
0
[root@localhost ~]# xuc=tre.text //將字符串重新定義
[root@localhost ~]# [[ "$xuc" == *.log ]] //是否有.log結尾的
[root@localhost ~]# echo $?
1
[root@localhost ~]# [[ "$xuc" != *.log ]] //!取反 是否沒有.log結尾的
[root@localhost ~]# echo $?
0
[root@localhost ~]#
( ){ }? 可以將多個命令組合在一起,批量執行
[root@localhost ~]# (cd /opt;ls)
999 nginx-1.18.0 qqq.sh test2
aa nginx-1.18.0.tar.gz rh
a.tar.gz nginx-1.18.0.tar.gz.0 test
etc qqq test1
( )會開啟子shell
{ }? 不會開啟子進程
if語句的結構
if語句? 單分支? ?判斷條件? 成功執行??
? ? ? ? ? ? ? ? ? ? ? ? ?不成功? ? ? ?不執行
分支結構
單分支
if 判斷條件;
then ? 條件為真的分支代碼
fi
雙分支
if 判斷條件;then
條件為假的分支代碼
fi
多分支
if 判斷條件1
then
?條件1為真的分支代碼
elif 判斷條件2
then
?條件2為真的分支代碼
elif 判斷條件3;then
?條件3為真的分支代碼
...
else
?以上條件都為假的分支代碼 ?托底
fi
舉例
單分支
判斷是否為超級管理員
#!/bin/bashif [ "$USER" != "root" ]
then
echo "非用戶管理員"
else
echo "是管理員用戶"
fi
判斷主機連通性
#!/bin/bash
ping -c 3 192.168.17.2
if
[ $? = 0 ]
then
echo "與真機網絡通暢"
exit 1
fi
echo "與真機不通"
多分支
考試成績
#!/bin/bash
read -p "請輸入你的成績:" cjif [ $cj -ge 85 ]&&[ $cj -le 100 ]
then
echo "你的成績為$cj"
echo "你的成績為優秀"elif [ $cj -ge 70 ]&&[ $cj -le 84 ]
then
echo "你的成績為$cj"
echo "你的成績為良好"elif [ $cj -ge 60 ]&&[ $cj -le 69 ]
then
echo "你的成績為$cj"
echo "你的成績為合格"
else
echo "你的成績為$cj"
echo "你的成績不合格"
fi
case
格式
case WORD in [PATTERN [| PATTERN]...) COMMANDS ;;]... esac
read -p
case $num??in
條件判斷1)
命令序列)
?;;
條件判斷2)
?命令序列2)
?;;
esac
字符
* 任意長度任意字符
? 任意單個字符
[0-9] 指定范圍內的任意單個字符
| ??或者,如: a|b
例子
考試成績
[root@localhost qqq]# bash 4.sh
請輸入你的分數4
4 不及格
[root@localhost qqq]# cat 4.sh
#!/bin/bashread -p "請輸入你的分數" cjcase $cj in
100)
echo "$cj 你好棒!"
;;
[89][0-9])
echo "$cj 一般般吧,仍需努力"
;;
[67][0-9])
echo "$cj 及格"
;;
[0-9]|[1-5][0-9])
echo "$cj 不及格"
;;*)
echo "輸入有誤"
esac
石頭剪刀布
#!/bin/bash
m=`echo $[RANDOM%3+1]`
read -p "請輸入 1.石頭2.剪刀3.布:" hif [ $m -eq $h ]
then
echo "打成平局"
bash $0
elif [ $h -eq 1 -a $m -eq 2 -o $h -eq 2 -a $m -eq 3 -o $h -eq 3 -a $m -eq 1 ]
then
echo "人類勝利"
else
echo 機器勝利
fi#!/bin/bash
key=`echo $[RANDOM%3+1]`
read -p "請輸入1包子 2剪子 3 錘子:" numcase $num in
1)num="包子"
;;
2)num="剪子"
;;
3)num="錘子"
;;
*)echo "你輸錯了!"exit
;;
esaccase $key in
1)key="包子"
;;
2)key="剪子"
;;
3)key="錘子"
;;
esacif [ $num = "包子" -a $key = "錘子" -o $num = "剪子" -a $key = "包子" -o $num = "錘子" -a $key = "剪子" ]
thenecho 機器出的是$key
echo 你出的是$num echo "人類勝利"
elif [ $num = $key ]
then
echo 機器出的是$key
echo 你出的是$num echo "打成平局再來一次"
elseecho 機器出的是$key
echo 你出的是$num
echo "機器勝利"
fi
echo
echo -n ? 表示不換行輸出
echo -e ? 表示輸出轉義符
常用的轉義符
不換行顯示
\c ?使用在數字中間會把后面內容刪除
date
date查看當前系統時間
-d 你描述的日期,顯示指定字符串所描述的時間,而非當前時間
%F 完整日期格式,等價于 %Y-%m-%d
% T 時間(24小時制)(hh:mm:ss
cal? 2023
seq?
從1 開始 步長為2 ?到10 為止
從 20開始? 步長為 -1 到1 為止