即使为真,Shell 脚本也会继续执行

Lê *_*ánh 3 scripts sh

我有一个简单的 shell 脚本来检查用户是否存在,如果不存在,请添加该用户

#!/usr/bin/bash
echo "Enter user"
read -r user
if [ "$(id -u "$user" &>/dev/null)" = 1 ]; then
  echo "user existed"
else
  useradd "$user"
  echo "add password"
  passwd "$user"
  echo "$user" &>>text.txt
  echo "saved"
fi
Run Code Online (Sandbox Code Playgroud)

但它不显示"echo user exist". 相反,它显示如下:

Enter user

abcdef

useradd: user 'abcdef' already exists

add password

New password: 
Run Code Online (Sandbox Code Playgroud)

在这种情况下abcdef是现有用户

请让我知道这里出了什么问题,非常感谢。

raj*_*raj 9

脚本中的以下条件:

if [ "$(id -u "$user" &>/dev/null)" = 1 ]; then
Run Code Online (Sandbox Code Playgroud)

永远不会是真的。当command的输出id -u "$user" &>/dev/null是单个数字 1时才为真,但由于该命令的任何输出都被重定向到/dev/null,这将永远不会发生。

将该行替换为

if { id -u "$user" &>/dev/null ; } then
Run Code Online (Sandbox Code Playgroud)

此条件检查命令的退出状态(而不是像它那样的输出$(...)),如果命令id -u "$user" &>/dev/null 成功(即用户存在)则为真,如果失败(即用户不存在)则为假。

  • `[` 是一个**命令**(相当于 `test`;参见 `man [`),用于检查各种条件表达式的结果。`{}` 只是将命令括起来的括号。实际上,我们可以完全跳过`{}`(而你**不能**跳过`[]`):`if id -u "$user" &>/dev/null ; then` 也能正常工作,只是可读性较差。 (2认同)