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