하나의 매개변수만 허용할 수 없습니다.

하나의 매개변수만 허용할 수 없습니다.

저는 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의 결과만 표시되고 에코 대신 나머지는 무시됩니다.Please 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로 입력하면 유효하지 않은 사용자 ID로 감지되지 않습니다( bill문자열이 대시로 시작하는 경우 grep -q "$userid" /etc/passwd이 명령은 오류를 생성할 수도 있음 ).$userid

데이터베이스에서 데이터를 가져오는 것과 관련된 모든 작업을 테스트 getent -- passwd "$userid"하고 수행하는 데 사용하는 것이 가장 좋습니다 .passwdgetent 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

관련 정보