我正在编写一个脚本来自动配置软件。我想首先检查脚本是否需要先安装软件,然后配置它。如果我检查$ software --version
并得到bash: command: command not found
,那么我知道我会首先安装它。
是否bash: command: command not found
返回 false?
编辑:对于任何答案,可以解释一下答案吗?
答案1
是的。
$ spamegg
spamegg: command not found
$ echo $?
127
你可以这样做:
if software --version &>/dev/null; then
## True, do something
else
## False, do something
fi
答案2
如果您的目的是检查特定命令是否可用,您应该这样做而不是尝试执行它:
if command -v spamegg >/dev/null; then
echo spamegg is available
else
apt-get install spamegg
fi
尝试执行spamegg
以查看它是否可用是一个不好的方法。首先,它会混淆您的代码,使其看起来像是spamegg
用于安装某些东西。其次(更重要的是),您正在检查的命令可能存在,但由于某种原因而失败:
if grep >/dev/null 2>&1; then
echo grep is available
else
echo grep is not available
fi
grep is not available
即使是这样也会输出。
答案3
恕我直言,我不认为你的方法是解决这个问题的最佳方法。原因只是因为命令返回未找到,并不意味着该程序不是已安装。它可能只是表明该程序不位于您的任何 PATH 位置。
也许,更好的方法是实际检查已安装软件包的列表:
RHEL/CentOS:
grep PROGRAM_NAME <(rpm -qa --qf "%{NAME}\n")
Debian/Ubuntu:
grep PROGRAM_NAME <(dpkg --get-selections | awk '{ print $1}')
答案4
# example you need wget and your PATH is okay then:
# bash/ksh/.. will return exit code 127 if command not found
#
# redirect stdin and stderr to the /dev/null = if exist,
# output is not interesting
wget --help >/dev/null 2>&1
stat=$? # variable ? include last command exit status
echo "exit status:$stat"
if ((stat == 127 )) ; then # not exist/found
echo "install wget"
exit 1
fi
echo "wget exist, continue"
您还可以使用 if before 命令,但该命令处理所有非 0 的退出代码。
您可以执行任何命令并使用 if 测试退出代码
# 如果命令;然后 # 工作正常 # 别的 # 不太好 # 菲
# negative testing ! = if not exit code 0 then
if ! wget --help >/dev/null 2>&1 ; then
# give err msg to the stderr and exit
echo "install wget / wget didn't work correctly" >&2
exit 1
fi
echo "wget works fine"
在使用 if 进行测试之前,首先查看工作退出代码
wget --帮助 回声$? # 将回显 0 = 好的。不为 0 不行 # 如果命令返回不为0,那么你不能使用if来测试,你需要 # 使用退出值 = 127 进行测试