在 shell 脚本中的 if 语句中添加“not”

在 shell 脚本中的 if 语句中添加“not”

如果用户不存在,我有以下脚本应该存在。

#check if user currently exists on system
if id $User > /dev/null 2>&1
then
    #user exists no need to exit program
    echo "blah blah, what a waste of space"
else
    echo "This user does NOT exists.  Please create that user before using this script.\n"
    exit
fi

我的问题是,我理想情况下希望在第一个 if 语句中放置一个“not”,以便我可以精简 if、else 语句。理想情况下,我希望这样做:

if !(id $User > /dev/null 2>&1)
then
    echo "This user does NOT exists.  Please create that user before using this script.\n"
    exit
fi

答案1

“Not” 的拼写为!,没有标点符号,后面有一个空格。

if ! id "$user_name" > /dev/null 2>&1
then
    echo 1>&2 "This user does NOT exists.  Please create that user before using this script.\n"
    exit 1
fi

您的建议实际上是可行的,但是括号会创建一个子 shell 来运行一个命令id,这是多余的。

其他变化:

  • 总是用双引号括住变量替换:"$user_name"
  • 已经有一个变量USER,它是当前登录用户的名称。变量名区分大小写,但人类并不这么认为。
  • 返回 1 到 125 之间的值来指示程序失败。
  • 将错误报告给标准错误(文件描述符 2),而不是标准输出。

答案2

有一个不是运算符在 shell 脚本中是这样的!,但是您使用它不太正确。

在运算符和其操作数之间添加一个空格!,并省略括号。这应该适用于所有POSIX 风格的 shell,包括bashsh/ dash

if ! id $User > /dev/null 2>&1
then
    echo "This user does NOT exists.  Please create that user before using this script.\n"
    exit
fi

您可以使用括号进行分组,但在本例中这不是必需的。将创建一个新的子 shell 来执行带括号的表达式。!运算符和字符之间仍应有一个空格(。(括号周围的空格是可选的。)

if ! (id $User > /dev/null 2>&1)
then
    echo "This user does NOT exists.  Please create that user before using this script.\n"
    exit
fi

Gilles 的精彩回答,了解一些不错的替代方案和样式建议。(此外,感谢 Gilles 对括号用法的一些修正。)

答案3

类似这样的问题在《高级 Bash 脚本指南》中得到了回答
- 可以在以下网址查看和下载:http://www.tldp.org/guides.html

相关内容