shell-----結構化命令

秦廣王發表於2019-05-19

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

 

相關文章