bash中常用的條件測試有三種
整數測試
-gt 大於
-le 小於等於
-ne 不等
-eq 相等
-ge 大於等於
-lt 小於
INT1=63
INT2=77
[ $INT1 -eq $INT2 ]
[[ $INT1 -eq $INT2 ]]
test $INT1 -eq $INT2
注意:命令的執行狀態結果為0,if判斷就是真;非0值對if就是為假
if `grep "^$USERNAME\>" /etc/passwd | cut -d: -f3`; then 這樣也可以判斷,但是意義不大
if [ `grep "^$USERNAME\>" /etc/passwd | cut -d: -f3` -eq 0 ]; then 這個是判斷使用者的uid是否等於0
if [ grep "^$USERNAME\>" /etc/passwd ]; then 這樣寫是錯誤的
檔案測試:
測試檔案是否存在 -e /path/filename
測試是否為普通檔案 -f /path/filename
測試指定路徑是否為目錄 -d 檔名/檔案路徑
-r FILE:測試當前使用者對指定檔案是否有讀取許可權;
-w FILE:測試當前使用者對指定檔案是否有寫許可權;
-x FILE:測試當前使用者對指定檔案是否有執行許可權;
[ -e /etc/inittab ]
[ -x /etc/rc.d/rc.sysinit ]
if codition; then
...
elif codition; then
...
elif codition; then
...
else
...
fi
問題:給定一個路徑,判斷檔案是否存在,有就提示有,否則提示沒有?
#!/bin/bash
file=/etc/inittab
if [ -e $file ]; then
echo "ok."
else
echo "No such file."
fi
測試指令碼是否有語法錯誤:
bash -n 指令碼
bash -x 指令碼 單步執行除錯
問題:給定一個檔案,如果其存在,如果是一個普通檔案,就顯示其為普通檔案;如果是目錄,就顯示其為目錄;否則顯示無法識別的檔案;
注意:如果不存在,則提前退出指令碼
#!/bin/bash
#
file=/etc/rc.d/rc.sysinit
if [ ! -e $file ]; then
echo "No such file."
exit 6
fi
if [ -f $file ]; then
echo "common file."
elif [ -d $file ]; then
echo "Directory."
else
echo "Unknown."
fi
注意:如果指令碼沒有明確定義退出碼,那麼,最後執行的一條命令的退出碼即為指令碼的退出狀態碼
bash變數的型別:
本地變數(區域性變數) : 作用域---當前shell程式
環境變數:作用域---當前shell程式及其子shell程式
位置變數:$1, $2, ...
shift 踢出最前面的$1... , 後面的補上
特殊變數:
$?
$# 引數的個數
$* 引數列表
$@ 引數列表,與$* 有點不同
引用指令碼的引數:
./xx.sh /etc/fstab /etc/inittab
$1 $2
練習:寫一個指令碼
能接受一個引數(檔案路徑),
判斷此引數如果是一個存在的檔案,就顯示ok,否則就顯示no such file;
#!/bin/bash
#
if [ $# -lt 1 ]; then
echo "Usage: ./7.sh ARG1 [ARG2 ...]"
exit 7
fi
if [ -e $1 ]; then
echo "Ok."
else
echo "No such file."
fi
shift測試:
預設一次踢掉一個
shift # 一次可踢掉多個
#!/bin/bash
#
echo $1
shift
echo $1
shift
echo $1
--------------
#!/bin/bash
#
echo $1
shift 2
echo $1
shift 2
echo $1
練習:寫一個指令碼
給指令碼傳遞兩個引數(整數),顯示此兩者之和,之積
注意:要測試給的引數夠不夠
#!/bin/bash
#
if [ $# -lt 2 ]; then
echo "Usage: cacl.sh ARG1 ARG2"
exit 8
fi
echo "The sum is: $[$1+$2]."
echo "The prod is: $[$1*$2]."
額外記錄:
如果使用者user6不存在,就新增使用者user6
! id user6 && useradd user6
id user6 || useradd user6
如果/etc/inittab檔案的行數大於100,就顯示好大的檔案;
[ `wc -l /etc/inittab | cut -d' ' -f1` -gt 100 ] && echo "Large file."
如果使用者存在,就顯示使用者已存在;否則,就新增此使用者;
id user1 && echo "user1 exists." || useradd user1
如果使用者不存在,就新增;否則,顯示其已經存在;
! id user1 && useradd user1 || echo "user1 exists."
如果使用者不存在,新增並且給密碼;否則,顯示其已經存在;
! id user1 && useradd user1 && echo "user1" | passwd --stdin user1 || echo "user1 exists."
練習,寫一個指令碼,完成以下要求:
1、新增3個使用者user1, user2, user3;但要先判斷使用者是否存在,不存在而後再新增;
2、新增完成後,顯示一共新增了幾個使用者;當然,不能包括因為事先存在而沒有新增的;
3、最後顯示當前系統上共有多少個使用者;
#!/bin/bash
num=0
! id user1 &> /dev/null && useradd user1 && echo 123456 | passwd --stdin user1 &> /dev/null && num=$[$num+1] || echo 'user1 exists'
! id user2 &> /dev/null && useradd user2 && echo 123456 | passwd --stdin user2 &> /dev/null && num=$[$num+1] || echo 'user2 exists'
! id user2 &> /dev/null && useradd user3 && echo 123456 | passwd --stdin user3 &> /dev/null && num=$[$num+1] || echo 'user3 exists'
echo "add $num user. , current os has `wc -l /etc/passwd` user."
練習,寫一個指令碼,完成以下要求:
給定一個使用者:
1、如果其UID為0,就顯示此為管理員;
2、否則,就顯示其為普通使用者;
如果 UID為0;那麼
顯示為管理員
否則
顯示為普通使用者
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 "common user."
fi
if id $NAME; then
練習:寫一個指令碼
判斷當前系統上是否有使用者的預設shell為bash;
如果有,就顯示有多少個這類使用者;否則,就顯示沒有這類使用者;
grep "bash$" /etc/passwd &> /dev/null
RETVAL=$?
if [ $RETVAL -eq 0 ]; then
if grep "bash$" /etc/passwd &> /dev/null; then
練習:寫一個指令碼
判斷當前系統上是否有使用者的預設shell為bash;
如果有,就顯示其中一個的使用者名稱;否則,就顯示沒有這類使用者;
練習:寫一個指令碼
給定一個檔案,比如/etc/inittab
判斷這個檔案中是否有空白行;
如果有,則顯示其空白行數;否則,顯示沒有空白行。
#!/bin/bash
A=`grep '^$' /etc/inittab | wc -l`
if [ $A -gt 0 ]; then
echo "$A"
else
echo "meiyoukongbaihang"
fi
#!/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
練習:寫一個指令碼
給定一個使用者,獲取其密碼警告期限;
而後判斷使用者密碼使用期限是否已經小於警告期限;
提示:計算方法,最長使用期限減去已經使用的天數即為剩餘使用期限;
如果小於,則顯示“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”。
練習:寫一個指令碼
給定一個檔案:
如果是一個普通檔案,就顯示之;
如果是一個目錄,亦顯示之;
否則,此為無法識別之檔案;
練習:寫一指令碼
能接受一個引數(檔案路徑)
判定:此引數如果是一個存在的檔案,就顯示“OK.”;否則就顯示"No such file."
練習:寫一個指令碼
給指令碼傳遞兩個引數(整數);
顯示此兩者之和,之乘積;
#!/bin/bash
#
if [ $# -lt 2 ]; then
echo "Usage: cacl.sh ARG1 ARG2"
exit 8
fi
echo "The sum is: $[$1+$2]."
echo "The prod is: $[$1*$2]."
練習:寫一個指令碼,完成以下任務
1、使用一個變數儲存一個使用者名稱;
2、刪除此變數中的使用者,且一併刪除其家目錄;
3、顯示“使用者刪除完成”類的資訊;
本作品採用《CC 協議》,轉載必須註明作者和本文連結