我已经编写了这个 bash 脚本,它测试用户是否具有超级用户权限,如果没有,它会要求它们。最终我试图反转第二个“if”语句,以便我可以删除以下两行(echo“password ok”和下一行的 else )
# Root user only
if [[ "$EUID" != 0 ]]; then
sudo -k # make sure to ask for password on next sudo
if sudo true; then
echo "Password ok"
else
echo "Aborting script"
exit 1
fi
fi
echo "do my ops"
第四行“true”的目的只是一个空语句吗?
我需要反转第四行的测试,该怎么做?这是我尝试过的:
if sudo false; then
if sudo true == false; then
if [!(sudo true)]; then
答案1
true
在 bash 中不是关键字,它是一个立即退出并带有成功退出代码的程序。同样,false
是一个以不成功的退出代码退出的程序。
您可以通过从终端运行这两个程序来尝试此操作,然后读取变量$?
,其中包含最后一个程序的退出代码;
true
echo $? # 0
false
echo $? #1
if sudo true
不等于if sudo == true
.正在使用if sudo true
运行程序,并检查退出代码。true
sudo
所以:
if sudo false; then
正在以 sudo 身份运行程序false
。返回值始终为 false。
if sudo true == false
true
将使用参数运行程序==
并false
使用sudo
.这显然不是你想要的。
if [!(sudo true)]
是无效语法。
您可能正在寻找的是
if ! sudo true;
答案2
我觉得接受的答案实际上并没有回答你的问题?
这目的这样做是为了检查你是否真的可以sudo
。
如何此检查是通过true
程序执行的,如接受的答案中所述。
答案3
正如我在这个脚本中看到的。它只是检查 sudo 是否启用,仅此而已。
true 只是返回 true。
因此,在这种情况下,如果他们需要使用 sudo 运行任何命令,它会首先在启动时进行检查,仅询问密码一次。
条件的工作原理如下:如果 sudo 正确执行 true 命令,则 if 条件返回 true,则 sudo 已启用并且用户输入的密码正确,否则您输入的密码错误或 sudo 未启用,脚本不得继续。
其他命令不需要询问 sudo 密码,因为您的身份验证在第一次就成功了(但这取决于 sudo 配置,因此此脚本很大程度上取决于环境配置)
“echo password ok”也证明了这一点。 shell 脚本将不再询问密码。