通过电子邮件向多个用户发送预定义消息的脚本

通过电子邮件向多个用户发送预定义消息的脚本

我想创建一个脚本,询问用户的用户名,并通过验证用户主目录是否存在来检查其是否有效。如果用户名存在,它应该从预定义的 .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+管道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要求)。

相关内容