저는 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"
에서 데이터를 가져오는 것과 관련된 모든 작업을 수행하는 것이 좋습니다 .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