網站首頁 編程語言 正文
在bash中,if是可以對語句做選擇執行,做if條件測試有整數測試,字符測試,文件測試三種形式。
if格式
單分支語法
if 條件; then 語句1 語句2 ... fi
雙分支語法
if 條件;then 語句1 語句2 else 語句2 fi
多分支語法
if 條件1; then 語句1 語句2 elif 條件2; then 語句1 語句2 else 語句1 語句2 fi
條件測試
if的判斷條件具體可以有以下幾種形式
- [ express ]
- [[ express ]]
- test express
- bash命令(命令執行成功則執行語句)
[],[[]],test作用類似,基本上在編寫bash腳本時可以互換
注意:[],[[]]空格位置;
[1個空格+表達式+1個空格]
[[1個空格+表達式+1個空格]]
示例:bash命令做if條件
示例1:查看系統是否有hadoop用戶,如果有返回uid和shell,沒有返回no
[root@node1 bash_test]# cat 17.sh? #!/bin/bash if id -u hadoop &> /dev/null;then ? ? grep "^hadoop" /etc/passwd | cut -d: -f1,7 else ? ? echo no fi [root@node1 bash_test]# ./17.sh? hadoop:/bin/bash
注意:
- id -u hadoop &> /dev/null指令的作用是執行id -u hadoop將其回執丟掉(不在終端顯示)
- bash命令做if條件時,當命令狀態返回值為真即值為0時,條件滿足:命令狀態返回值1-255即條件不滿足
命令狀態返回值
我們可以使用$?查看上一條命令的命令狀態返回值,命令成功執行返回0,失敗執行返回1
[root@node1 bash_test]# id hadoop uid=4024(hadoop) gid=4024(hadoop) 組=4024(hadoop),4026(mygrp) [root@node1 bash_test]# echo $? 0 [root@node1 bash_test]# id hadoop111 id: hadoop111: no such user [root@node1 bash_test]# echo $?
當然在bash腳本中,我們可以使用exit退出程序時,后面接的數字則代表命令執行情況。例如:exit 0代表執行成功,exit 1代表執行失敗
整數測試
if條件測試是為了比較整數時,具體規則如下
expression: 數值1 比較符號 數值2
比較符號:
大于 -gt
大于或等于 -ge
等于 -eq
不等于 -ne
小于 -gt
小于或等于 -ge
示例1:讀取一個參數,如果他小于10返回Yes,大于10返回No
[root@node1 bash_test]# cat 18.sh? #!/bin/bash if [ $1 -lt 10 ];then ? echo Yes else ? echo No fi [root@node1 bash_test]# ./18.sh 5 Yes [root@node1 bash_test]# ./18.sh 11 No
注意:$1代表終端傳入的第一個參數
bash中位置變量有:
$1,$2,$3…
$@ $* 顯示所有位置變量
$@ 五個字符串當成一個字符串顯示
$* 五個字符串各自顯示
$# 顯示位置變量個數
$? 保存剛剛執行命令的狀態返回值
shift 實現位置參數輪替
結合shfit可以使用一個$1可以得到所有的變量
shfit 2 指定輪替2個
例如:執行命令./18.sh 5
$0為./18.sh
$1為5
@ 和 @和@和* 均為"./18.sh 5"
$#為1
示例2:寫一個腳本隨機生成兩個數,比較其大小
[root@node1 bash_test]# cat 19.sh? #!/bin/bash A=$RANDOM B=$RANDOM result="" if [ $A -lt $B ];then ? result="A is greater than B" elif [ $A -gt $B ];then ? result="A is less then B" else ? result="A equals B" fi echo "A = $A, B = $B, $result" [root@node1 bash_test]# ./19.sh? A = 6646, B = 3889, A is less then B
$RANDOM 生成隨機數 0-32767之間的數
字符測試
if條件為字符比較大小時,默認以ASCII碼表做大小比較
除了使用符號-lt,-gt,-le,-ge,-eq,-ne做判斷,我們也可以使用下述符號做判斷
?> : 大于
?< : 小于
?== :等于
?!= :不等于
單目測試
?-z $STRING 字符串的長度,為空則為真,非空為假
?-n $STRING 為空則為假,不空則真
?=~ 判斷左邊的字符串是否能夠被右邊的模式所匹配,通常用于雙[[ ?]]中
? ? ?一般用行首,行尾錨定$,不能用詞首詞尾錨定\< \>?
? ? 不能用引號
一般我們用==比較多,用來判斷兩個字符串是否相等
示例1:寫一個腳本,可以接受一個參數,其使用形式如下所示:
script.sh {start|stop|restart|status}
其中:
如果參數為start,則創建空文件/var/lock/subsys/script,并顯示“starting script successfully.”
如果參數為stop,則刪除文件/var/lock/subsys/script,并顯示“Stop script successfully.”
如果參數為restart,則刪除文件/var/locksubsys/script并重新創建,而后顯示“Restarting script successfully.”
如果參數為status,那么:如果文件/var/lock/subsys/script存在,則顯示“Script is running…”,否則,則顯示“Script is stopped.”
其他任何參數;則顯示“script.sh {start|stop|restart|status}”
#!/bin/bash # echo $1 if [ $1 == "start" ];then if [ -e /var/lock/subsys/script ];then echo "script is already running." else mkdir /var/lock/subsys/script echo "Starting script successfully." fi elif [ $1 == "stop" ];then if [ -e /var/lock/subsys/script ];then rm -rf /var/lock/subsys/script echo "Stop script finished." else echo "script is stopped yet." fi elif [ $1 == "restart" ];then rm -rf /var/lock/subsys/script mkdir /var/lock/subsys/script echo "Restarting script successfully." elif [ $1 == "status" ];then if [ -e /var/lock/subsys/script ];then echo "script is running." else echo "script is stopped." fi else echo "script.sh {start|stop|restart|status}" fi
文件測試
對文件進行操作,主要有以下幾種
單目測試
?-f 測試其是否為普通文件,即ls -l 時文件類型為-的文件 ?
?-d 測試其是否為目錄文件,即ls -l 時文件類型為-的目錄 ?
?-e 測試文件是否存在,存在為真 ?
?-r,-w,-x這三個都是判斷文件權限,是否有讀,寫,執行權限 ?
?-s 測試文件大小是否不空,不空則真,空為假
?-l -b -c這三個判斷文件是否為相應類型
示例:如果/tmp/test10不存在,則創建它
[root@node1 bash_test]# cat 21.sh? #!/bin/bash if [ ! -e /tmp/test10 ];then ? ? mkdir /tmp/test10 fi [root@node1 bash_test]# ls -ld /tmp/test10 ls: 無法訪問/tmp/test10: 沒有那個文件或目錄 [root@node1 bash_test]# ./21.sh? [root@node1 bash_test]# ls -ld /tmp/test10 drwxr-xr-x 2 root root 6 8月 ? 1 21:21 /tmp/test10
組合條件測試
當有多個判斷需要做時,可以使用如下進行連接
符號 | 符號意義 | 示例 | 解釋 |
---|---|---|---|
-a | 與,符號左右兩邊都需要滿足; | [ $A > 300 -a $A < 500 ] | A變量值大于300,而且要小于500滿足條件 |
-o | 或,符號左右兩邊只要滿足一個; | [ $B < 10 -o $A > 100 ] | B變量小于10或者A變量小于100 |
! | 非,將結果取反; | [ ! id hadoop &> /dev/null ] | 如果沒有hadoop用戶則滿足條件 |
如果使用獨立命令做組合條件時,使用與&&,||或,!非
示例1:寫一個腳本,給定用戶,如果不存在退出腳本
[root@node1 bash_test]# cat 20.sh #!/bin/bash if ! id $1 > /dev/null;then echo "no find this user" exit 6 else id $1 fi [root@node1 bash_test]# ./20.sh hadoop uid=4024(hadoop) gid=4024(hadoop) 組=4024(hadoop),4026(mygrp) [root@node1 bash_test]# ./20.sh hadoop1 id: hadoop1: no such user no find this user
示例2:通過參數傳-一個字符串給腳本,如果傳遞的字符串為“memory"或"Memory",就以MB為單位顯示當前主機的內存信息:否則,就顯示/proc/uptime文件的內容。
#!/bin/bash if [[ $1 == "memory" || $1 == "Memory" ]]; then free -tm else cat /proc/uptime fi
注意:
|| 短路操作,前面為真,不會運行后面
&& 前面為假,無需運算后面
如果我們需要前面為假,運行后面程序,使用||
如果我們需要前面為真,運行后面程序,使用&&
示例1:如果/tmp/test10不存在,則創建它
[ -e /tmp/test10 ] || mkdir /tmp/test10
示例2:如果/tmp/test10文件夾存在,則在該文件夾下創建hello文件
[ -d /tmp/test10 ] && touch /tmp/test10/hello
示例3:如果/tmp/test10/hello文件存在,則顯示’exist’;不存在則顯示’not exist’
[ -f /tmp/test10/hello ] && echo "exist" || echo "not exist"
原文鏈接:https://blog.csdn.net/xgy123xx/article/details/126110515
相關推薦
- 2022-06-17 教你Docker安裝GitLab功能_docker
- 2022-11-19 如何使用?Go?和?Excelize?構建電子表格_Golang
- 2022-06-25 python實現人機對戰的井字棋游戲_python
- 2023-01-12 jQuery事件與動畫超詳細講解_jquery
- 2024-01-15 Stream流 - 獲取Stream和轉換操作(含基本數據類型流)
- 2022-07-15 Python中的//符號是什么意思呢_python
- 2022-11-21 正則表達式RegExp語法與用法詳解_正則表達式
- 2022-05-22 分享jQuery的3種常見事件監聽方式_jquery
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支