寫腳本時,經常要判斷字符串是否相等,檢查文件狀態或是數字測試等。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