저는 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
- 그런 다음
grep "$userid" /etc/passwd | cut -d: -f5 | sort | sed 's/^\(.*\), \(.*\)$/\2 \1/'
AND를 표시합니다.echo is NOT currently logged on
그런 다음 코드 1로 스크립트를 종료합니다.
사용자가 로그인한 경우(종료 코드 0을 반환함):who | grep $userid
- 그런 다음
grep "$userid" /etc/passwd | cut -d: -f5 | sort | sed 's/^\(.*\), \(.*\)$/\2 \1/'
AND를 표시합니다.echo is currently logged on
그런 다음 코드 0으로 스크립트를 종료합니다.
사용자가 유효한지 확인:
사용자가 유효하지 않은 경우(종료 코드 1을 반환함):grep $userid /etc/passwd
- 그러면 표시되어야합니다
echo "The user you entered, $userid is not a valid user on this system."
사용자가 유효한 경우(종료 코드 0을 반환함):grep $userid /etc/passwd
이 스크립트를 어떻게 작성하나요? 전체 구조는 어떻게 되나요? 구조/설정에 갇혀 있습니다.
답변1
이것은 과제처럼 보이므로 도구와 몇 가지 힌트만 제공하겠습니다.
스크립트에 인수가 지정되지 않은 경우
$1
(스크립트의 첫 번째 인수)는 비어 있습니다. 으로 이를 테스트할 수 있습니다[[ -z $1 ]]
. 오류를 표시하고 싶다면너무 많아인수를 사용하여 인수 수를 테스트합니다[[ $# -eq 1 ]]
(단일 인수에 대해 true임).이
gentent passwd "$username"
명령을 사용하여passwd
사용자에 대한 항목을 가져올 수 있습니다$username
. 사용자가 존재하지 않으면 명령은 0이 아닌 종료 상태로 실패합니다. 이는if ! getent passwd "$username" >/dev/null; then ...; fi
존재하지 않는 사용자에게 반응하는 데 사용할 수 있음을 의미합니다$username
.passwd
사용자 항목 의 5번째 필드대개사용자의 전체 이름을 포함합니다(실제로 "이름 성" 형식이라는 보장은 없습니다). 항목 끝에 삭제해야 할 추가 쉼표가 있을 수 있습니다.getent passwd "$username"
using 의 출력을 구문 분석하여cut -d: -f 5
다섯 번째 필드를 가져온 다음 를 사용하여 첫 번째 쉼표에서 삭제할 수 있습니다name=${name%%,*}
.일부 시스템에서는 사용자의 전체 이름에
&
문자가 포함될 수 있습니다. 해당 시스템에서는 이 문자를 사용자 이름으로 바꿔야 합니다( 사용자의&
이름은 이 됩니다 ). Linux가 일반적으로 이 작업을 수행하는지 확실하지 않지만 .System &
operator
System operator
name=${name/&/$username}
유틸리티
who
는 현재 로그온한 사용자 목록을 출력합니다.$username
이에 대응하려면 를 사용하십시오grep -e "^$username\>"
. 예를 들어 or 를 볼 때 일치하지 않도록\>
는 단어의 끝과 일치 합니다 . 진술 에 유용합니다 .antony
anton
grep -q
if
이는 코드 구조를 따릅니다.
- 잘못된 인수를 확인하고 처리합니다(누락: 읽기, 너무 많음: 종료하거나 먼저 사용). 하나의
if
진술. - 잘못된 사용자 이름을 확인하고 처리하세요. 하나의
if
진술. - 사용자의 전체 이름을 가져옵니다. 명령 대체를 통한 변수 할당.
- 사용자가 로그온(및 출력)되었는지 확인합니다. 분기가 포함된 하나의
if
명령문입니다else
.
이 스크립트에는 루프가 표시되지 않으므로 여러 if
-문과 변수 할당이 될 것입니다.