if-then語句
bash shell的if語句會執行if後面的那個命令,如果該命令的退出碼狀態為0會執行then部分的命令,如果是其他值不會執行。
格式如下:
if command then commands fi
例項:
[root@node1 ljy]# more ceshi.sh #!/bin/bash if pwd then echo "ok" fi [root@node1 ljy]# sh ceshi.sh /ljy ok
在then部分可以使用多條命令。
[root@node1 ljy]# more ceshi.sh #!/bin/bash testuser=ljy if grep $testuser /etc/passwd then echo "ok" fi [root@node1 ljy]# sh ceshi.sh ljy:x:1000:1000::/home/ljy:/bin/bash ok
if-then-else
格式如下:
if command then commands else commands fi
用法很簡單,看一個例子就行
[root@node1 ljy]# more ceshi.sh #!/bin/bash testuser=ljy if grep $testuser /etc/passwd then echo "$testuser exit on system!" else echo "$testuser does ont on system!" fi [root@node1 ljy]# sh ceshi.sh ljy:x:1000:1000::/home/ljy:/bin/bash ljy exit on system! #此時我定義一個不存在的變數 [root@node1 ljy]# more ceshi.sh #!/bin/bash testuser=ljy1 if grep $testuser /etc/passwd then echo "$testuser exit on system!" else echo "$testuser does ont on system!" fi [root@node1 ljy]# sh ceshi.sh ljy1 does ont on system!
巢狀if
語法很簡單看一個例子:
[root@node1 ljy]# more ceshi.sh #!/bin/bash testuser=zhangsan if grep $testuser /etc/passwd then echo "$testuser exit on system!" else echo "$testuser does ont on system!" if ls -d /home/$testuser then echo "but $testuser have a directory!" fi fi [root@node1 ljy]# sh ceshi.sh zhangsan does ont on system! /home/zhangsan but zhangsan have a directory!
也可以用else部分的另外一種形式elif
格式如下:
if command then commands elif command2 then more commands fi
例項:
[root@node1 ljy]# more ceshi.sh #!/bin/bash testuser=zhangsan if grep $testuser /etc/passwd then echo "$testuser exit on system!" elif ls -d /home/$testuser then echo "but $testuser have a directory!" fi [root@node1 ljy]# sh ceshi.sh /home/zhangsan but zhangsan have a directory!
test命令
如果test命令中列出的條件成立,test命令就會退出並返回特推出狀態碼0
test 命令可以判斷3類條件:
1. 數值比較
2. 字串比較
3. 檔案比較
1、數值比較
注意:test 命令中不能使用浮點數。
例項:
[root@node1 ljy]# more ceshi.sh #!/bin/bash value1=10 value2=11 # if [ $value1 -gt 5 ] #左括號右側和右括號左側各加一個空格,否則會報錯。 then echo "$value1 is bigger than 5" fi [root@node1 ljy]# sh ceshi.sh 10 is bigger than 5
2、字串比較
條件測試還允許比較字串值
字串比較的三大注意事項:
1. 比較的變數最好加上雙引號。
2. 大於小於符號必須轉義(使用\>),否則 shell 會把它們當做重定向符號而把字串值當做檔名。
3. 大於小於順序和 sort 命令所採用的不同。(test預設大寫字母小於小寫字母)
例項:
[root@node1 ljy]# more ceshi.sh #!/bin/bash value1=basketball value2=football # if [ $value1 \> $value2 ] then echo "$value1 is greater than $value2" else echo "$value1 is less than $value2" fi [root@node1 ljy]# sh ceshi.sh basketball is less than football
-n和-z可以檢查一個變數是否含有資料。
[root@node1 ljy]# more ceshi.sh #!/bin/bash value1=basketball value2=' ' # if [ -n $value1 ] then echo "'$value1' is not empty" else echo "'$value1' is empty" fi # if [ -z $value2] then echo "'$value2' is empty" else echo "'$value2' is not empty" fi [root@node1 ljy]# sh ceshi.sh 'basketball' is not empty ' ' is empty
-n判斷長度是否非0,-z判斷長度是否為0
3、檔案比較
-d檢測目錄是否存在。
[root@node1 ljy]# more ceshi.sh #!/bin/bash value1=/home/ljy if [ -d $value1 ] then echo "$value1 is exited" else echo "$value1 is not exited" fi [root@node1 ljy]# sh ceshi.sh /home/ljy is exited
-e允許指令碼程式碼在使用檔案或者目錄前先檢測是否存在。
[root@node1 ljy]# more ceshi.sh #!/bin/bash value1='lisi' if [ -e /home/$value1 ] then echo "$value1 is exited" else echo "$value1 is not exited" fi [root@node1 ljy]# sh ceshi.sh lisi is exited
-f確定物件是否為檔案。
[root@node1 ljy]# more ceshi.sh #!/bin/bash value1='zhangsan' if [ -e /home/$value1 ] #判斷變數是否存在 then echo "$value1 is exited" if [ -f /home/$value1 ] #判斷是否為檔案 then echo "$value1 is a file" else echo "$value1 is a directory" fi else echo "$value1 is not exited" fi [root@node1 ljy]# sh ceshi.sh zhangsan is exited zhangsan is a directory
-r測試檔案是否可讀。
[ljy@node1 ljy]$ more ceshi2.sh #!/bin/bash pwfile=/home/lisi # if [ -r $pwfile ] then tail $pwfile else echo "this file unable to read!" fi [ljy@node1 ljy]$ sh ceshi2.sh this file unable to read!
-s檢測檔案是否為非空,尤其是在不想刪除非空檔案的時候。
[root@node1 ljy]# more ceshi2.sh #!/bin/bash pwfile=/home/lisi # if [ -s $pwfile ] then echo "this file is not empty" else echo "$pwfile is empty" echo "Deleting empty file..." rm $pwfile fi [root@node1 ljy]# sh ceshi2.sh /home/lisi is empty Deleting empty file...
-w判斷對檔案是否可寫。
[root@node1 ljy]# more ceshi2.sh #!/bin/bash pwfile=/home/lisi # if [ -w $pwfile ] then echo "this file can be write!" date +%H%M >> $pwfile else echo "$pwfile can not be write" fi [root@node1 ljy]# sh ceshi2.sh this file can be write!
-x判斷檔案是否有執行許可權。
當然這是針對的非root使用者。
[root@node1 ljy]# more ceshi2.sh #!/bin/bash pwfile=/home/test.sh # if [ -x $pwfile ] then echo "this file can be run!" sh $pwfile else echo "$pwfile can not be run!" fi [root@node1 ljy]# sh ceshi2.sh this file can be run!
複合條件測試
if-then 語句允許使用布林邏輯來組合測試:
- 與:[ condition1 ] && [ condition2 ] 或者 [ condition1 -a condition2 ]
- 或:[ condition1 ] || [ condition2 ] 或者 [ condition1 -o condition2 ]
- 非:[ !condition ]
例項:
[root@node1 ljy]# more ceshi2.sh #!/bin/bash pwfile=/home/test.sh # if [ -d $pwdfile ] && [ -x $pwfile ] then echo "this file can be run!" sh $pwfile else echo "$pwfile can not be run!" fi [root@node1 ljy]# sh ceshi2.sh this file can be run!
case命令
為單個變數尋找特定的值,可以用 case 命令,而不是寫那麼多的 elif 語句檢查。case 命令會檢查單個變數列表格式的多個值:
case variable in pattern1 | pattern2) commands1 ;; pattern3) commands2 ;; *) default commands ;; esac
case 命令會將指定的變數同不同模式進行比較。
如果變數和模式是匹配的,那麼 shell 會執行為該模式指定的命令。
也可以通過豎線操作符來分割模式,在一行列出多個模式。星號會捕獲所有跟所有列出的模式都不匹配的值。
[root@node1 ljy]# more ceshi2.sh #!/bin/bash case $USER in root | barbara) echo "Welcome $USER" echo 'Enjoy your visit' ;; testing) echo "Special testing acount" ;; jessica) echo "Don't forget to log off" ;; *) echo "Sorry, you aren't allowed here" ;; esac [root@node1 ljy]# sh ceshi2.sh Welcome root Enjoy your visit