我是 Bash 腳本編寫的初學者,我的腳本運作不正常。我不知道如何修復它或編碼它的正確方法。使用者應該只能輸入一個參數。 ( $ nowOn f132a99
) 如果輸入多個參數,則會提示「Please enter a single, valid user id: "
我不確定如何解決此問題」。
$ nowOn f132a99 = 正確的輸出
$ nowOn f132a99 f132a98 = 第 1 行二進位運算子預期錯誤
$ nowOn f132a99 f132a98 f132a97 = 第 1 行錯誤太多參數
if [ -z "$@" ]; then
echo -n "Please enter a single, valid user id: "
read userid
else
userid="$@"
fi
#user validation check
if ! grep -q "$userid" /etc/passwd >/dev/null 2>&1;then
echo
echo "The user you entered, $userid is not a valid user on this system."
exit 2
else
#login check
if ! who | grep "$userid" >/dev/null 2>&1;then
echo
echo `grep "$userid" /etc/passwd | cut -d: -f5 | sort | sed 's/^\(.*\), \(.*\)$/\2 \1/'` is NOT currently logged on
exit 1
else
#login check
echo
echo `grep "$userid" /etc/passwd | cut -d: -f5 | sort | sed 's/^\(.*\), \(.*\)$/\2 \1/'` is currently logged on.
exit 0
fi
fi
我還嘗試了下面的以下程式碼,但如果您輸入多個參數 ( nowOn f132a99 f132a97
) 那麼它將只顯示 f132a99 的結果並忽略其餘部分,而不是 echoPlease enter a single, valid user id:
if [ -z "$1" ]; then
echo -n "Please enter a single, valid user id: "
read userid
else
userid="$1"
fi
答案1
是的,您的測試[ -z "$@" ]
沒有按照您的預期進行。將"$@"
擴展為引用的每個單獨的命令列參數,這為您提供了一個基本上類似於[ -z "f132a99" "f132a98" "f132a97" ]
三個參數的測試。
如果您希望使用者只給一個參數,您應該做的正是您提到的在你自己的回答中,即使用類似的測試[ "$#" -ne 1 ]
來測試無效輸入。
然而,還有另一種選擇,那就是考慮全部將給定參數作為使用者 ID,並循環它們:
if [ "$#" -eq 0 ]; then
echo 'No user ID given' >&2
exit 1
fi
for userid do
# code to process "$userid" goes here
done
關於您的程式碼的其他註解:
對有效使用者 ID 的測試有缺陷。考慮一個沒有使用者呼叫的系統bill
,但有是A billy
。作為使用者 ID輸入bill
不會將其偵測為無效使用者 ID (如果字串以短劃線開頭,則grep -q "$userid" /etc/passwd
此命令也可能會產生錯誤)。$userid
最好使用 進行測試getent -- passwd "$userid"
,並執行passwd
與從資料庫中取得資料相關的所有操作getent passwd
。
您也有類似的問題who | grep "$userid"
,最好寫成who | grep -q "^$userid\>"
。
我提到了這些事情在我對你之前問題的回答中。
答案2
使用以下方法解決了它:
if [ $# -ne 1 ]; then
echo -n "Please enter a single, valid user id: "
read userid
else
userid="$1"
fi