我是 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
- 然後顯示
grep "$userid" /etc/passwd | cut -d: -f5 | sort | sed 's/^\(.*\), \(.*\)$/\2 \1/'
ANDecho is NOT currently logged on
然後以代碼 1 結束腳本。
如果使用者已登入(將返回登出代碼 0):who | grep $userid
- 然後顯示
grep "$userid" /etc/passwd | cut -d: -f5 | sort | sed 's/^\(.*\), \(.*\)$/\2 \1/'
ANDecho is currently logged on
然後以代碼 0 結束腳本。
判斷使用者是否有效:
如果使用者無效(將返回退出代碼 1):grep $userid /etc/passwd
- 然後它應該顯示
echo "The user you entered, $userid is not a valid user on this system."
如果使用者有效(將返回退出代碼 0):grep $userid /etc/passwd
我該如何編寫這個腳本?完整的結構是怎樣的?我被困在結構/設置上。
答案1
由於這看起來像是一項作業,我只會為您提供工具和一些提示:
如果沒有為腳本提供參數,則
$1
(腳本的第一個參數)將為空。您可以使用 來測試這一點[[ -z $1 ]]
。如果您想顯示錯誤太多參數,測試參數的數量[[ $# -eq 1 ]]
(對於單一參數來說是正確的)。此
gentent passwd "$username"
指令可用於取得passwd
使用者的條目$username
。如果使用者不存在,該命令將失敗並傳回非零退出狀態。這意味著您可以使用if ! getent passwd "$username" >/dev/null; then ...; fi
對不存在的用戶做出反應$username
。passwd
使用者條目的第 5 個字段通常包含使用者的全名(實際上不能保證它將採用“名字姓氏”形式)。該條目末尾可能有多餘的逗號,您必須將其刪除。您可以解析getent passwd "$username"
using的輸出cut -d: -f 5
來取得第五個字段,然後使用 刪除第一個逗號name=${name%%,*}
。在某些系統上,使用者的全名可能包含一個
&
字元。在這些系統上,該&
字元應替換為使用者名稱(以便System &
使用者的名稱operator
變為System operator
)。我不確定 Linux 通常會這樣做,但這可以透過name=${name/&/$username}
.此
who
實用程式輸出目前登入的使用者清單。要$username
與之匹配,請使用grep -e "^$username\>"
.匹配\>
單字的結尾,因此antony
在查找 或 時,eg 不匹配anton
。grep -q
在聲明中很有用if
。
程式碼結構如下:
- 檢查並處理無效參數(缺少:讀取;太多:退出或先使用)。一份
if
聲明。 - 檢查並處理無效的使用者名稱。一份
if
聲明。 - 取得用戶的全名。透過命令替換進行變數賦值。
- 檢查使用者是否登入(和輸出)。一份
if
聲明,可能有一個else
分支。
我在這個腳本中沒有看到循環,因此它將是許多if
- 語句和變數賦值。