我正在编写一个脚本来使用 Bash 安装程序。我想在出现错误时退出,因此我set -e
在脚本的开头添加了以下内容。
我必须检查脚本中是否存在用户。为此,我使用grep ^${USER}: /etc/passwd
。如果用户存在,脚本将正常运行。但是,如果用户不存在,则此命令退出。如果发生后一种情况,我不想退出。相反,我想创建用户并继续安装。
有什么解决方案可以让我的脚本继续运行?我尝试将的输出重定向grep
到变量,但仍然遇到同样的问题。
答案1
您始终可以执行类似下面的操作。基本上禁用您正在运行的命令的退出检查。
#!/bin/bash
set -e # eanble exit checking
lorem ipsum
dolor sit amet
# temp disable exit checking
set +e
grep "^${USER}:" /etc/passwd
set -e
consectetur adipiscing elit
答案2
除了已经给出的建议外,这里还有两个选择。首先,您可以提供一个可以保证成功的备用命令:
grep "^${USER}:" /etc/passwd || true
(基本上,如果grep
命令失败,它将运行true
,并且由于它总是成功,它会认为复合命令已经成功并且不会退出脚本。)
或者,由于您感兴趣的是 grep 是否成功(即是否需要添加用户),只需将其用作语句中的条件if
:
if ! grep "^${USER}:" /etc/passwd; then
# Create the user account
fi
# Continue installation...
(请注意,命令!
前的grep
否定测试,因此仅当grep
失败时才运行 if 语句的主体。由于grep
是复合命令的一部分,因此如果失败,脚本不会退出。)
答案3
解决方案是不要使用,set -e
因为这可能非常危险。在适当的情况下使用 if 语句。
grep "^${USER}:" /etc/passwd &>/dev/null
if [ $? -eq 1 ]
then
#create user here ...
ft
答案4
一个建议是运行该检查并在 () 内的子 shell 中安装。这对你有用吗?