종료 코드 문이 있는 If 문

종료 코드 문이 있는 If 문

저는 Linux/Unix 초보자입니다. 내 과제는 다음과 같습니다. 여기에 모든 내용을 게시하기에는 너무 깁니다.https://i.stack.imgur.com/v2AJR.jpg

내가 가진 논리는 다음과 같습니다.:

이 코드는 사용자가 인수를 입력했는지 여부를 확인합니다. 다른 것 아래에 무엇을 넣어야할지 모르겠습니다. 우리는 여기서 다른 사용자로부터 배운 진술에 대해 말한 적이 없으므로 사용될 것으로 예상되지 않습니다. 단지 기본적인 명령일 뿐이며 이것은 고급 과제가 아닙니다.

if [ $# -ne 1 ]; then
        echo Please enter a single, valid user id: 
        read userid
else
        userid=$1
        **what goes here?**
fi

사용자의 전체 이름(예: Ben Franklin)을 표시하기 위해 제가 작성하고 테스트한 코드는 다음과 같습니다.

grep "$userid" /etc/passwd | cut -d: -f5 | sort | sed 's/^\(.*\), \(.*\)$/\2 \1/'

사용자가 로그인했는지 여부를 확인합니다.

사용자가 로그인하지 않은 경우(종료 코드 1 반환):who | grep $userid

  1. 그런 다음 grep "$userid" /etc/passwd | cut -d: -f5 | sort | sed 's/^\(.*\), \(.*\)$/\2 \1/'AND를 표시합니다.echo is NOT currently logged on 그런 다음 코드 1로 스크립트를 종료합니다.

사용자가 로그인한 경우(종료 코드 0을 반환함):who | grep $userid

  1. 그런 다음 grep "$userid" /etc/passwd | cut -d: -f5 | sort | sed 's/^\(.*\), \(.*\)$/\2 \1/'AND를 표시합니다.echo is currently logged on 그런 다음 코드 0으로 스크립트를 종료합니다.

사용자가 유효한지 확인:

사용자가 유효하지 않은 경우(종료 코드 1을 반환함):grep $userid /etc/passwd

  1. 그러면 표시되어야합니다echo "The user you entered, $userid is not a valid user on this system."

사용자가 유효한 경우(종료 코드 0을 반환함):grep $userid /etc/passwd

이 스크립트를 어떻게 작성하나요? 전체 구조는 어떻게 되나요? 구조/설정에 갇혀 있습니다.

답변1

이것은 과제처럼 보이므로 도구와 몇 가지 힌트만 제공하겠습니다.

  1. 스크립트에 인수가 지정되지 않은 경우 $1(스크립트의 첫 번째 인수)는 비어 있습니다. 으로 이를 테스트할 수 있습니다 [[ -z $1 ]]. 오류를 표시하고 싶다면너무 많아인수를 사용하여 인수 수를 테스트합니다 [[ $# -eq 1 ]](단일 인수에 대해 true임).

  2. gentent passwd "$username"명령을 사용하여 passwd사용자에 대한 항목을 가져올 수 있습니다 $username. 사용자가 존재하지 않으면 명령은 0이 아닌 종료 상태로 실패합니다. 이는 if ! getent passwd "$username" >/dev/null; then ...; fi존재하지 않는 사용자에게 반응하는 데 사용할 수 있음을 의미합니다 $username.

  3. passwd사용자 항목 의 5번째 필드대개사용자의 전체 이름을 포함합니다(실제로 "이름 성" 형식이라는 보장은 없습니다). 항목 끝에 삭제해야 할 추가 쉼표가 있을 수 있습니다. getent passwd "$username"using 의 출력을 구문 분석하여 cut -d: -f 5다섯 번째 필드를 가져온 다음 를 사용하여 첫 번째 쉼표에서 삭제할 수 있습니다 name=${name%%,*}.

    일부 시스템에서는 사용자의 전체 이름에 &문자가 포함될 수 있습니다. 해당 시스템에서는 이 문자를 사용자 이름으로 바꿔야 합니다( 사용자의 &이름은 이 됩니다 ). Linux가 일반적으로 이 작업을 수행하는지 확실하지 않지만 .System &operatorSystem operatorname=${name/&/$username}

  4. 유틸리티 who는 현재 로그온한 사용자 목록을 출력합니다. $username이에 대응하려면 를 사용하십시오 grep -e "^$username\>". 예를 들어 or 를 볼 때 일치하지 않도록 \>는 단어의 끝과 일치 합니다 . 진술 에 유용합니다 .antonyantongrep -qif

이는 코드 구조를 따릅니다.

  1. 잘못된 인수를 확인하고 처리합니다(누락: 읽기, 너무 많음: 종료하거나 먼저 사용). 하나의 if진술.
  2. 잘못된 사용자 이름을 확인하고 처리하세요. 하나의 if진술.
  3. 사용자의 전체 이름을 가져옵니다. 명령 대체를 통한 변수 할당.
  4. 사용자가 로그온(및 출력)되었는지 확인합니다. 분기가 포함된 하나의 if명령문입니다 else.

이 스크립트에는 루프가 표시되지 않으므로 여러 if-문과 변수 할당이 될 것입니다.

관련 정보