이메일을 통해 여러 사용자에게 미리 정의된 메시지를 보내는 스크립트

이메일을 통해 여러 사용자에게 미리 정의된 메시지를 보내는 스크립트

사용자에게 사용자 이름을 묻고 사용자의 홈 디렉터리가 있는지 확인하여 유효한지 확인하는 스크립트를 만들고 싶습니다. 사용자 이름이 존재하는 경우 사전 정의된 .txt 파일에서 사용자에게 이메일을 보내야 합니다. 사용자가 존재하지 않으면 유효한 사용자 이름이 제공될 때까지 지속되어야 합니다. 또한 "exit"라는 단어가 사용자 이름으로 제출되면 스크립트가 종료되어야 합니다. 이것이 내가 지금까지 한 일입니다:

#!/bin/bash
echo "Input your username"
dir="/home"
read username

if [$username -e $dir]
then 
cat Message.txt | mailx -s "Subject" $username
else
echo "The user does not exist. Please type a valid username."
fi

메시지가 있는 부분은 괜찮다고 생각하지만(확실하지는 않지만) 종료 및 입력 유효성 검사에 문제가 있습니다!

답변1

디렉토리가 존재하는지 테스트하려면 다음을 사용하십시오.

if [ -d somepath ]; then ...; fi

[및 주변 공간을 참고하세요 ]. 귀하의 경우에는 somepath그렇습니다 "$dir/$username". 따라서 테스트는 다음과 같습니다.

if [ -d "$dir/$username" ]; then ...; fi

mailx또한 코드 내 호출 등의 변수 확장에는 항상 큰따옴표를 사용해야 한다는 점을 기억하세요.

cat+pipe를 작성하면 단순화할 수 있습니다.mailx

mailx -s 'Subject' "$username" <Message.txt

getent passwd "$username"유효한 사용자 이름을 테스트하는 또 다른 방법은 종료 상태를 실행하고 테스트하는 것입니다 .

if getent passwd "$username" >/dev/null; then
    : valid user
else
    : invalid user
fi

daemon그러나 이는 서비스 사용자 계정(예: 일반 사용자) 간에 차이가 없습니다.

스크립트에 대한 마지막 일반적인 설명은 스크립트를 완료하기 위해 스크립트 인수에서 사용자 이름을 읽는 것이 더 합리적일 수 있다는 것입니다.

./myscript "username"

"$1"그런 다음 스크립트 내에서 대신 사용할 수 있으며 "$username"(또는 할당 username=$1) 대화형 읽기를 호출하지 않습니다 read. 이렇게 하면 다른 비대화형 스크립트에서 스크립트를 호출할 수 있게 됩니다(이 경우 유용하지 않을 수 있음).

이는 또한 유효하지 않은 사용자 이름으로 스크립트를 실행하면 오류 메시지가 출력되며, 새로운 올바른 이름으로 스크립트를 간단히 다시 실행할 수 있으므로 불필요하게 복잡한 입력 유효성 검사 루프(및 요구 사항 exit) 형식을 수행할 필요가 없음을 의미합니다.

관련 정보