電子メールを介して複数のユーザーに事前定義されたメッセージを送信するスクリプト

電子メールを介して複数のユーザーに事前定義されたメッセージを送信するスクリプト

ユーザーにユーザー名を尋ね、ユーザーのホームディレクトリがあることを確認して、有効であることを確認するスクリプトを作成したいと思います。ユーザー名が存在する場合は、事前定義された.txtファイルからユーザーに電子メールを送信する必要があります。ユーザーが存在しない場合は、有効なユーザー名が指定されるまで持続する必要があります。また、「終了」という単語がユーザー名で送信されたら、スクリプトを終了する必要があります。これが私がこれまでにしたことです:

#!/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"有効なユーザー名をテストするもう1つの方法は、終了ステータスを実行してテストすることです。

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

daemonただし、これはサービスユーザーアカウント(一般ユーザーなど)に違いはありません。

スクリプトの最後の一般的な説明は、スクリプトを完了するためにスクリプト引数からユーザー名を読み取ることがより合理的である可能性があることです。

./myscript "username"

"$1"その後、スクリプト内で代わりに使用でき"$username"(または割り当てusername=$1)、対話型読み取りを呼び出すことはありませんread。これにより、他の非対話型スクリプトからスクリプトを呼び出すことができます(この場合は役に立たないかもしれません)。

これはまた、無効なユーザー名でスクリプトを実行するとエラーメッセージが表示され、新しい正しい名前でスクリプトを単に再実行できるため、不必要に複雑な入力検証ループ(および要件exit)形式を実行する必要がないことを意味しますします。

関連情報