我已经写了这个函数:
function isInstalled {
if [ rpm -q $1 &> /dev/null ]; then
echo 'installed';
return 1;
else
echo 'not installed';
return 0;
fi
}
但有些地方不对劲。它总是返回 0。即使安装了包也是如此。我想我没有正确检查返回信号。
[vagrant@centos-7 ~]$ isInstalled wget2
not installed
[vagrant@centos-7 ~]$ isInstalled wget
not installed
[vagrant@centos-7 ~]$ rpm -q wget
wget-1.14-10.el7_0.1.x86_64
答案1
if [ rpm -q ... &> /dev/null ]
是内置命令的无效使用[
。如果您没有重定向 stderr,您会在错误消息中看到此内容,如下所示:
if [ rpm -q $1 >/dev/null ]; then
您执行的每个命令都有一个退出代码,因此无需包装[ ... ]
,并且这是无效的语法。
这样写:
isInstalled() {
if rpm -q $1 &> /dev/null; then
echo 'installed';
return 1;
else
echo 'not installed';
return 0;
fi
}
答案2
你的函数应该写成
isInstalled() {
if rpm -q "$1" >/dev/null ; then
echo "installed"
return 0
else
echo "not installed"
return 1
fi
}
笔记:
这定义函数的更可移植的语法只是
function_name() { … }
方括号
[ ]
仅适用于特定类型的测试,例如判断字符串是否为空。你不需要它们来检查命令的退出状态。你的重定向语法是错的。
在 shell 编程中,通常返回零状态表示成功,返回非零状态表示失败。因此,您应该交换返回值。
引用任何变量时,您几乎总是应该使用双引号。否则,您的脚本将因意外输入(例如space参数中的字符)而中断(可能以危及安全的方式)。
答案3
function isInstalled {
rpm -q $1 &> /dev/null;
if [ $? == 0 ]; then
return true;
else
return false;
fi
}
测试:if [ isInstalled wget ]; then echo 'installed'; else echo 'not installed'; fi