帶有退出代碼語句的 If 語句

帶有退出代碼語句的 If 語句

我是 Linux/Unix 的初學者。這是我的作業,在這裡發布所有內容太長了:https://i.stack.imgur.com/v2AJR.jpg

這是我的邏輯

此代碼將檢查使用者是否輸入了參數。我不知道該把什麼放在別的下面。我們從未討論過我從另一個用戶那裡學到的which語句,因此預計不會使用它。只是基本命令,這不是一個超級進階的任務。

if [ $# -ne 1 ]; then
        echo Please enter a single, valid user id: 
        read userid
else
        userid=$1
        **what goes here?**
fi

要顯示使用者的全名(即本富蘭克林),這是我編寫和測試的程式碼:

grep "$userid" /etc/passwd | cut -d: -f5 | sort | sed 's/^\(.*\), \(.*\)$/\2 \1/'

判斷使用者是否登入:

如果使用者未登入(將返回登出代碼 1):who | grep $userid

  1. 然後顯示grep "$userid" /etc/passwd | cut -d: -f5 | sort | sed 's/^\(.*\), \(.*\)$/\2 \1/'ANDecho is NOT currently logged on 然後以代碼 1 結束腳本。

如果使用者已登入(將返回登出代碼 0):who | grep $userid

  1. 然後顯示grep "$userid" /etc/passwd | cut -d: -f5 | sort | sed 's/^\(.*\), \(.*\)$/\2 \1/'ANDecho is currently logged on 然後以代碼 0 結束腳本。

判斷使用者是否有效:

如果使用者無效(將返回退出代碼 1):grep $userid /etc/passwd

  1. 然後它應該顯示echo "The user you entered, $userid is not a valid user on this system."

如果使用者有效(將返回退出代碼 0):grep $userid /etc/passwd

我該如何編寫這個腳本?完整的結構是怎樣的?我被困在結構/設置上。

答案1

由於這看起來像是一項作業,我只會為您提供工具和一些提示:

  1. 如果沒有為腳本提供參數,則$1(腳本的第一個參數)將為空。您可以使用 來測試這一點[[ -z $1 ]]。如果您想顯示錯誤太多參數,測試參數的數量[[ $# -eq 1 ]](對於單一參數來說是正確的)。

  2. gentent passwd "$username"指令可用於取得passwd使用者的條目$username。如果使用者不存在,該命令將失敗並傳回非零退出狀態。這意味著您可以使用if ! getent passwd "$username" >/dev/null; then ...; fi對不存在的用戶做出反應$username

  3. passwd使用者條目的第 5 個字段通常包含使用者的全名(實際上不能保證它將採用“名字姓氏”形式)。該條目末尾可能有多餘的逗號,您必須將其刪除。您可以解析getent passwd "$username"using的輸出cut -d: -f 5來取得第五個字段,然後使用 刪除第一個逗號name=${name%%,*}

    在某些系統上,使用者的全名可能包含一個&字元。在這些系統上,該&字元應替換為使用者名稱(以便System &使用者的名稱operator變為System operator)。我不確定 Linux 通常會這樣做,但這可以透過name=${name/&/$username}.

  4. who實用程式輸出目前登入的使用者清單。要$username與之匹配,請使用grep -e "^$username\>".匹配\>單字的結尾,因此antony在查找 或 時,eg 不匹配antongrep -q在聲明中很有用if

程式碼結構如下:

  1. 檢查並處理無效參數(缺少:讀取;太多:退出或先使用)。一份if聲明。
  2. 檢查並處理無效的使用者名稱。一份if聲明。
  3. 取得用戶的全名。透過命令替換進行變數賦值。
  4. 檢查使用者是否登入(和輸出)。一份if聲明,可能有一個else分支。

我在這個腳本中沒有看到循環,因此它將是許多if- 語句和變數賦值。

相關內容