하나의 인수만 허용하는 데 문제가 있음

하나의 인수만 허용하는 데 문제가 있음

저는 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존재하는 시스템을 생각해 보십시오.~이다billy. bill사용자 ID로 입력하면 잘못된 사용자 ID로 감지되지 않습니다( 문자열이 대시로 시작하는 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

관련 정보