Bash: 如何检查用户是否存在?

4

我正在编写一个脚本,可以通过参数 ($1) 添加、删除和更改用户的密码。我想检查该用户是否存在,以便更好地控制它。我知道这个问题已经被问了很多次,之前我也在谷歌上搜索过,但事实上,这些解决方案对我并没有起作用,我不知道我的错误在哪里,非常抱歉。

这是我的代码:

#!/bin/bash
existe=$(grep -c '^$1:' /etc/passwd)

if [ $existe -eq 0 ]; then
    echo "The user $1 exists"
    echo ""
else
    echo "The user $1 does not exist"
    echo ""
fi

我尝试了">/dev/null"和"getent"等方法,但是无论我做什么,用户始终存在。我粘贴在这里的代码是我最后尝试的代码。你能帮我吗?^^ 先谢谢你。
3个回答

5

您需要使用双引号进行变量替换,并且您的测试条件是错误的:

exists=$(grep -c "^$1:" /etc/passwd)

if [ $exists -eq 0 ]; then
    echo "The user $1 does not exist"
else
    echo "The user $1 exists"
fi

此外,您可以使用 id(1)

我们不能只使用$1而不是^$1:吗? - User123
1
@User123 从行首匹配用户名更加安全,而且 : 可以匹配用户名的结尾,因为 passwd 文件格式就是这样的。 - georgexsh
哦,我以为$1可以是任何东西,比如用户名/用户ID等。如果只传递了用户名,那就没问题 :) - User123
1
好的,那就这样吧,在这种情况下,可以使用\b$1\b来匹配整个字符串,但我认为这不是一个好主意,id更合适。 - georgexsh
是的,实际上这可能会引起误解。 - User123
哦,谢谢,它起作用了。这全是关于那个双引号的问题。 愚蠢的错误,但比我犯的错误条件还不愚蠢!非常感谢!:D - Sandrituky

2
您也可以直接使用 grep 的返回值来实现这一点:
if grep -q "^$1:" /etc/passwd; then
    printf 'The user %s exists\n' "$1"
else
    printf 'The user %s does not exist\n' "$1"
fi

或者更好的方法是使用getent
if getent passwd "$1" >/dev/null; then
    printf 'The user %s exists\n' "$1"
else
    printf 'The user %s does not exist\n' "$1"
fi

如果您实际上不需要计数,那么您无需尝试保存计数并稍后检查。命令本身的退出代码将告诉您是否找到它。


1
你可以使用grep作为条件。
#!/bin/sh
grep -q "^$1:" /etc/passwd && echo exists || echo FALSE

如果您喜欢块状的命令式条件语句

#!/bin/sh
if grep -q "^$1:" /etc/passwd ;then
    echo exists
else
    echo FALSE
fi

(均已使用bash和dash进行测试)。

通过具有固定的布尔输出而不包括输入,我们避免了未预料到的副作用。 - Alexx Roche

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接