我想创建一个脚本来检查用户是否存在。我正在使用以下逻辑:
# getent passwd test > /dev/null 2&>1
# echo $?
0
# getent passwd test1 > /dev/null 2&>1
# echo $?
2
因此,如果用户存在,那么我们就成功了,否则该用户不存在。我在bash脚本中放置了以下命令,如下所示:
#!/bin/bash
getent passwd $1 > /dev/null 2&>1
if [ $? -eq 0 ]; then
echo "yes the user exists"
else
echo "No, the user does not exist"
fi
现在,我的脚本总是说该用户存在,无论如何:
# sh passwd.sh test
yes the user exists
# sh passwd.sh test1
yes the user exists
# sh passwd.sh test2
yes the user exists
为什么上述条件总是评估为TRUE并说用户存在?
我要去哪里错了?
更新:
阅读所有答复后,我在脚本中发现了问题。问题是我重定向getent
输出的方式。因此,我删除了所有重定向内容,并使该getent
行如下所示:
getent passwd $user > /dev/null
现在我的脚本运行正常。
getent
和你的if
说法?这将导致$?
检查的退出状态echo
,而不是您对的调用getent
。
2>&1
不是2&>1
。
$1
未设置,则if语句将返回true。根据我的测试,解决方案是$1
用双引号引起来:getent passwd "$1" > /dev/null 2&>1
。
$?
会获得test
命令的返回码。请参阅下面的答案。