shell之條件測試

 寫腳本時,經常要判斷字符串是否相等,檢查文件狀態或是數字測試等。Shell提供了對字符串、文件、數值及邏輯操作等內容的條件測試的支持。

 

格式:

test expression

[ expression ]            注意空格

` expression `

COMMAND

 

整數測試:

-gt

-lt

-ge

-le

-ne

-eq

[ 2 -gt 3 ]

 

NUM1=22

NUM2=17

 

[ $NUM1 -le $NUM2 ]

 

字符串測試:用兩個中括號 ` `

>

<

>=

<=

!=

==

單目:

-z “abc”    測試是否爲空

-n              測試是否不空

 

 

文件測試:

-e /path/to       exist

-f /path/to        普通文件 不包括目錄

-d /path/to       目錄

-r /path/to        讀權限測試

-w /path/to      寫權限

-x /path/to        執行權限

 

命令的邏輯的關係:

 

 

mkdir /tmp/abc

 

if 判斷:

如果滿足:

statement;

statement;

結束

 

雙分支:

如果存在:

顯示目錄已經存在

否則:

創建目錄;

說明創建成功;

結束

 

多分支

如果滿足條件一:

語句;

如果滿足條件二:

語句:

如果滿足條件三:

語句

否則:

語句

結束

 

 

if 測試條件; then

statement1;

statemnet2;

fi

例:文件不存在創建:[ ! -e /tmp/abc ] && mkdir /tmp/abc

 

 

用戶兩個變量保存兩個整數,在腳本中判斷誰是大數,並顯示出來;

 

NUM1, NUM2

 

if NUM1大於NUM2; then

顯示NUM1是大數;

else

顯示NUM2是大數;

fi

 

if [ $NUM1 -gt $NUM2 ]; then

echo “$NUM1 is the max number.”

else

echo “$NUM2 is the max number.”

fi

 

 

if /tmp目錄下存在hello的文件;then

echo “hello已經存在;

else

創建此目錄;

顯示創建成功;

fi

 

if [ -e /tmp/hello ]; then

echo “/tmp/hello exists.”

else

mkdir /tmp/hello

echo “Create /tmp/hello successfully.”

fi

 

創建用戶yellowdog

 

if yellowdog存在;then

說明此用戶已經存在;

else

創建此用戶;

添加密碼

創建成功

fi

 

if id yellowdog; then

echo “A user.”

else

useradd yellowdog

echo “yellowdog” | passwd –stdin yellowdog

echo “Create a user yellowdog.”

fi

 

判斷指定的路徑對應文件的類型,如果是目錄,如果是文件,否則,無法識別;

 

if 是目錄;then

說明是目錄;

elif 是文件;then

說明是文件;

else

說明天外來物;

fi

 

MYPATH=/etc/pam.d

 

if [ -d $MYPATH ]; then

echo “$MYPATH is a directory.”

elif [ -f $MYPATH ]; then

echo “$MYPATH is a common file.”

else

echo “An allien.”

fi

 

 

 

 

 

連接兩個條件:

-a: 與關係;

-o: 或關係;

!: 非關係;

 

if [ $UID -ge 1 -a $UID -le 499 ]

 

 

給定一個用戶帳號:

取出此用戶的UID號;

如果UID=0,說明這是管理員;

如果UID>1並且UID<499,說明這是系統用戶;

否則,說明這是普通用戶;

 

 

使用命令取出用戶的ID號,並保存至變量MYID中;

 

if ID號等於0; then

說明這是管理員

elif ID號大於等於1並且小於等於499;

說明這是系統用戶

else

說明這是普通用戶;

fi

 

 

MYID=`id -u user1`

 

if [ $MYID -eq 0 ]; then

echo “Admin.”

elif [ $MYID -ge 1 ] && [ $MYID -le 499 ]; then

echo “Sys user.”

else

echo “Common user.”

fi

 

 

 

 

glob: 文件名通配

*:

?:

[]:

 

 

 

 

一下是例子和練習:

 

寫一個腳本:執行腳本,會打開一個非登錄式shell,通常是當前shell的了shell進程;

1、創建目錄/tmp/scripts

2、切換工作目錄至此目錄中

3、複製/etc/pam.d目錄至當前目錄,並重命令爲test

4、將當前目錄中的test及其裏面的文件和子目錄的屬主改爲redhat

5、將test及其子目錄中的文件的其它用戶的權限改爲沒有任何權限

 

 

 

 

寫一個腳本:

1、顯示當前系統日期和時間,而後創建目錄/tmp/lstest

2、切換工作目錄至/tmp/lstest

3、創建目錄a1d, b56e, 6test

4、創建空文件xy, x2y, 732

5、列出當前目錄下以a、x或者6開頭的文件或目錄;ls [ax6]*,  ls | grep “\<[ax6].*”

6、列出當前目錄下以字母開頭,後跟一個任意數字,而後跟任意長度字符的文件或目錄;ls [a-zA-Z][0-9]*

 

練習:寫一個腳本,完成以下功能

1、顯示/var/目錄下的所有文件或子目錄,但要把所有字母換成大寫;

2、以一個命令顯示當前系統上所有可用shell對應的可執行文件的文件內容類型,並讓結果以全大寫的方式顯示;

 

 

寫一個腳本:

給定一個用戶,想辦法判斷此用戶是否已經登錄進系統;

如果此用戶登錄到系統上了,就顯示用戶已經登錄;

否則,說明此用戶尚未登錄;

 

寫一個腳本:

給定一個用戶,想辦法判斷此用戶的UID跟其基本組GID是否一致;

如果一致,就將此用戶的用戶名添加至/tmp/goodusers,並顯示這是個好人;

否則,就將此用戶的用戶名添加至/tmp/badusers,並顯示此人是壞蛋;

 

寫一個腳本,要求同上,但取出用戶的ID號時不能使用id命令來實現;

 

寫一個腳本:

給定一個文件,相辦法判斷此文件是否存在;

如果存在,就統計出此文件中的空白行的行數,並顯示出來;

否則,就說明此文件路徑有錯誤;

 

寫一個腳本:

判斷文件/etc/inittab文件中,是否有某一行中某個數字曾出現過至少三次;

如果有,顯示這樣的行共有多少個;

否則,顯示沒有這樣的行;

 

 

 

 

 

if [ -x /usr/bin/id ]; then

         USER=”`id -un`”

         LOGNAME=$USER

         MAIL=”/var/spool/mail/$USER”

fi

 

 

if [ -z "$INPUTRC" -a ! -f "$HOME/.inputrc" ]; then

    INPUTRC=/etc/inputrc

fi

 

 

 

if ! echo $PATH | /bin/egrep -q “(^|:)$1($|:)” ; then

         if [ "$2" = "after" ] ; then

             PATH=$PATH:$1

         else

             PATH=$1:$PATH

         fi

fi

 

 

 

 

if [ -x /usr/bin/links ]; then

         httpget=”/usr/bin/links”;

elif [ -x /usr/bin/lynx ]; then

         httpget=”/usr/bin/lynx”;

fi

 

 

 

某文件存在時,就判斷文件類型,不存在時,就說明此文件不存在;

 

if [ -e FILE ];then

if [ -f FILE ]; then

echo “common”

elif [ -d FILE ]; then

echo “dir”

else

echo “Unkown.”

fi

else

echo “Not exists.”

fi

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章