無法只允許一個參數

無法只允許一個參數

我是 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

相關內容