bash:“set -e”并检查用户是否存在使脚本退出

bash:“set -e”并检查用户是否存在使脚本退出

我正在编写一个脚本来使用 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 中安装。这对你有用吗?

相关内容