Linux shell基礎1

junwind發表於2021-03-08
bash中常用的條件測試有三種
    整數測試
        -gt 大於
        -le 小於等於
        -ne 不等
        -eq  相等
        -ge  大於等於
        -lt  小於

        INT1=63
        INT2=77
        [ $INT1 -eq $INT2 ]
        [[ $INT1 -eq $INT2 ]]
        test $INT1 -eq $INT2

    注意:命令的執行狀態結果為0if判斷就是真;非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、如果其UID0,就顯示此為管理員;
    2、否則,就顯示其為普通使用者;

如果 UID0;那麼
  顯示為管理員
否則
  顯示為普通使用者

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



練習:寫一個指令碼
給定一個使用者,判斷其UIDGID是否一樣
如果一樣,就顯示此使用者為“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 協議》,轉載必須註明作者和本文連結
六月的風

相關文章