如果用户不存在,我有以下脚本应该存在。
#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,包括bash
和sh
/ 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