Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash:如何检查用户是否存在?_Bash_Shell - Fatal编程技术网

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

Bash:如何检查用户是否存在?,bash,shell,Bash,Shell,我正在制作一个脚本,用于添加用户、删除用户和更改作为参数传递的用户的密码($1)。我想检查用户是否存在,以便更好地控制它。我知道这个问题已经被问过很多次了,我以前也在谷歌上搜索过,但事实上,这些解决方案对我来说并不适用,我不知道哪一个是我的错误,所以很抱歉 这是我的代码: #!/bin/bash existe=$(grep -c '^$1:' /etc/passwd) if [ $existe -eq 0 ]; then echo "The user $1 exists" ec

我正在制作一个脚本,用于添加用户、删除用户和更改作为参数传递的用户的密码($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”解决方案。。。啊。。。 无论我做什么,用户总是存在的,我粘贴在这里的代码是我最后一次尝试的代码


你能帮我吗提前感谢。

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

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

此外,您可以使用。

您也可以使用
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

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

您可以使用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进行了测试)。

我们不能只使用
$1
而不是
^$1:
?@User123从行的开头匹配用户名更安全,
匹配用户名的结尾,因为passwd文件格式是这样的。哦,我想
$1
可以是:username/uid等等。,如果只传递用户名,那么就可以了:)好吧,这是公平的,在这种情况下,可以使用
\b$1\b
,作为整体匹配,但我认为这不是一个好主意,
id
更合适。是的,实际上。这可能会产生误导。通过使用不包含输入的固定布尔输出,我们可以避免不可预见的副作用