Linux雜記7

junwind發表於2021-03-08
條件判斷,控制結構
    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. 如果其UID0,就顯示此為管理員
    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


練習:寫一個指令碼,完成以下任務
給定一個使用者,判斷其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



提前結束指令碼:
    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 協議》,轉載必須註明作者和本文連結
六月的風