我想创建一个脚本来检查用户是否存在。我正在使用以下逻辑:
# getent passwd test > /dev/null 2&>1
# echo $?
0
# getent passwd test1 > /dev/null 2&>1
# echo $?
2
如果用户存在,则操作成功,否则用户不存在。我已将上述命令放在以下Bash脚本中:
所以,如果用户存在,那么我们就成功了,否则用户不存在。我已将上述命令放入下面的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
现在我的脚本运行良好。
$?
时,你会得到test
命令的返回代码。请参见下面的答案。 - user000001getent
和if
语句之间没有“echo”调试语句吗?否则会导致$?
检查echo
的退出状态,而不是你对getent
的调用。 - chepner2>&1
而不是2&>1
。 - Tim Ludwinski$1
未设置,则 if 语句将返回 true。根据我的测试,解决方案是将$1
包装在双引号中:getent passwd "$1" > /dev/null 2&>1
。 - Vincegetent
命令无法运行的原因是你打错了:2&>1
__不是有效的重定向__。 - jimis