條件判斷,控制結構
if 判斷條件; then
statement1
...
fi
if 判斷條件; then
statement1
...
else
statement2
...
fi
判斷條件為真 或 假
注意:Linux中 0 (命令的執行狀態返回值) 為真; 其它數值為假
#!/bin/bash
name=user1
if id $name &> /dev/null; then
echo "$name exists."
fi
-----------------
#!/bin/bash
name=user17
if id $name &> /dev/null; then
echo "$name exists."
else
echo "$name not exists."
fi
-------------------
#!/bin/bash
name=user17
if id $name &> /dev/null; then
echo "$name exists."
else
useradd $name
echo $name | passwd --stdin $name &> /dev/null
echo "add $name finished."
fi
練習:寫一個指令碼,完成以下任務---用if語句改寫
給定一個使用者:
1. 如果其UID為0,就顯示此為管理員
2. 否則,就顯示其為普通使用者
NAME=user16
USERID=`id -u $NAME`
if [ $USERID -eq 0 ]; then
echo 'admin.'
else
echo 'common user.'
fi
NAME=user16
if [ `id -u $NAME` -eq 0 ]; then
echo 'admin'
else
echo 'comon user'
fi
注意下面的區別:
if id user7 &> /dev/null 這種是使用命令執行後的狀態返回碼
if [ `id -u $NAME` -eq 0 ]; then 這種是引用命令的執行結果
[root@localhost tmp]# ls /var 執行結果
account cache db empty games lib local lock log mail nis opt preserve racoon run spool tmp yp
[root@localhost tmp]# echo $? 執行的返回狀態值
0
[root@localhost tmp]# A=`ls /var` 引用命令的執行結果
[root@localhost tmp]# echo $A
account cache db empty games lib local lock log mail nis opt preserve racoon run spool tmp yp
練習:寫一個指令碼,完成以下任務
判斷當前系統上是否有使用者的預設shell為bash; grep 'bash$' /etc/passwd | wc -l
如果有,就顯示有多少個這類使用者;否則,就顯示沒有這類使用者;
#!/bin/bash
#
grep "\<bash$" /etc/passwd &> /dev/null
retval=$?
if [ $retval -eq 0 ]; then
users=`grep "\<bash$" /etc/passwd | wc -l`
echo "the shells of $users users is bash."
else
echo "No such users."
fi
提示:
引用一個命令的執行結果,要使用命令引用 如 result=`wc -l /etc/passwd | cut -d: -f1`
使用一個命令的執行狀態結果,要直接執行此命令 如 if id user1
如果想把一個命令的執行結果賦值給變數, 要命令引用 userid = `id -u user1`
如果想把一個命令的執行狀態結果儲存下來,並作為命令執行成功與否的判斷條件,則需要先執行此命令,
而後引用其狀態結果,如
id -u user1
result = $?
練習:寫一個指令碼
判斷當前系統上是否有使用者的預設shell為bash;
如果有,就顯示其中一個的使用者名稱;否則,就顯示沒有這類使用者;
#!/bin/bash
#
grep "\<bash$" /etc/passwd &> /dev/null
retval=$?
if [ $retval -eq 0 ]; then
auser=`grep "\<bash$" /etc/passwd | head -1 | cut -d: -f1`
echo "$auser is one of such users."
else
echo "No such user."
fi
----------------------------------
#!/bin/bash
username=`grep '\<bash$' /etc/passwd | head -1 | cut -d: -f1`
if id $username &> /dev/null; then
echo $username;
else
echo 'no such user'
fi
練習:寫一個指令碼,完成以下任務
給定一個檔案,比如/etc/inittab,判斷這個檔案中是否有空白行
如果有,則顯示其空白行數,否則,顯示沒有空白行;
#!/bin/bash
FILE=/etc/inittab
if [ ! -e $FILE ]; then
echo "No $FILE."
exit 8
fi
if grep "^$" $FILE &> /dev/null; then
echo "Total blank lines: `grep "^$" $FILE | wc -l`."
else
echo "No blank line."
fi
練習:寫一個指令碼,完成以下任務
給定一個使用者,判斷其UID與GID是否一樣,
如果一樣,就顯示此使用者為“good guy”,否則,就顯示此使用者為“bad guy”
#!/bin/bash
username=user1
userid=`id -u $username`
groupid=`id -g $username`
if [ $userid -eq $groupid ]; then
echo 'good guy.'
else
echo 'bad guy.'
fi
進一步要求,不使用id命令獲得其id號
#!/bin/bash
#
USERNAME=user1
if ! grep "^$USERNAME\>" /etc/passwd &> /dev/null; then
echo "No such user: $USERNAME."
exit 1
fi
USERID=`grep "^$USERNAME\>" /etc/passwd | cut -d: -f3`
GROUPID=`grep "^$USERNAME\>" /etc/passwd | cut -d: -f4`
if [ $USERID -eq $GROUPID ]; then
echo "Good guy."
else
echo "Bad guy."
fi
提前結束指令碼:
exit 退出當前程式,指令碼
任何一個程式執行結束了,一定有一個執行結果 和 一個執行狀態結果
exit 可以定義執行狀態結果是什麼;如果沒有定義,
則預設把exit前面那一條命令的退出執行狀態當作整個指令碼的執行狀態結果
exit #
練習:寫一個指令碼,完成以下任務
給定一個使用者,獲取其密碼警告期限
而後判斷使用者最近一次修改密碼時間距今天是否已經小於警告期限;
提示:算術運算的方法 $($A-$B);表示變數A的值減去變數B的值的結果;
如果小於,則顯示”warning“;否則,就顯示”ok“
練習:寫一個指令碼,完成以下任務
給定一個使用者,獲取其密碼警告期限;
而後判斷使用者密碼使用期限是否已經小於警告期限;
提示:最長使用期限 - 已經使用的天數 = 剩餘使用期限
已使用的天數=今天-上次修改密碼的時間
如果小於,則顯示”warning“;否則,就顯示”ok“
圓整:丟棄小數點後的所有內容
#!/bin/bash
W=`grep "student" /etc/shadow | cut -d: -f6`
S=`date +%s`
T=`expr $S/86400`
L=`grep "^student" /etc/shadow | cut -d: -f5`
N=`grep "^student" /etc/shadow | cut -d: -f3`
SY=$[$L-$[$T-$N]]
if [ $SY -lt $W ]; then
echo 'Warning'
else
echo 'OK'
fi
練習:寫一個指令碼,完成以下任務
判定命令歷史中歷史命令的總條目是否大於1000,如果大於,則顯示”some command will gone“;否則顯示”ok“
預設history快取中,和~/.bash_history檔案中,都只保留1000條
[root@localhost ~]# echo $HISTSIZE
1000
[root@localhost ~]# echo $HISTFILESIZE
1000
history | tail -1 | cut -d' ' -f2
shell中如何進行算術運算?
注意:shell本身把所有變數當作字元
[root@localhost tmp]# a=3
[root@localhost tmp]# b=6
[root@localhost tmp]# echo $a+$b
3+6
[root@localhost tmp]# let c=$a+$b
[root@localhost tmp]# echo $c
9
方法一:
let C=$A+$B
方法二:
C=$[$A+$B]
方法三:
$((算術運算表示式))
C=$(($A+$B))
方法四:expr命令 算術運算表示式 表示式中各運算元及運算子之間要有空格,而且要使用命令引用
C=`expr $A + $B`
本作品採用《CC 協議》,轉載必須註明作者和本文連結