
저는 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"
하고 수행하는 데 사용하는 것이 가장 좋습니다 .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