我正在尝试创建一个条件语句,以检查grep是否已安装包。如果为真,则不应安装包,如果为false,则应安装包。我总是得到相同的结果包没有安装,无论我放哪个值,请帮助(在我的情况下,所有的软件包都已安装,并且grep找到一个匹配的。这是代码:
chk1=$(yum list installed | grep rpmdevtools)
chk2=$(yum list installed | grep rpmbuild)
chk3=$(yum list installed | grep rpmdev)
if [[ $chk1 -ne 0 && "$chk2" -ne 0 && "$chk3" -ne 0 ]];then
echo "package exists"
sleep 5
else
echo "package doesn't exists installing .."
sleep 5
sudo yum install wget -y
wget http://mirror.centos.org/centos/7/os/x86_64/Packages/rpmdevtools-8.3-5.el7.noarch.rpm
sudo yum install rpmdevtools-8.3-5.el7.noarch.rpm -y
fi
发布于 2022-02-04 14:25:53
您在这里混合了两种结果:结果(即显示的文本)和返回值。
TL;DR
可以验证变量$chkX
是否与[[ ! -z ${chkX} ]]
一起为空,如:
if [[ ! -z ${chk1} ]] && [[ ! -z ${chk2} ]] && [[ ! -z ${chk3} ]]; then
[...]
或者你可以这样做,根据出口代码。
yum list installed | grep -q vim
if [[ $? -eq 0 ]]; then
# do your stuff here when package is installed
else
#.. do your stuff here when package isn't installed ..
fi
或
if yum list installed | grep -q 'vim' ;then
# do your stuff here when package is installed
else
# .. do your stuff here when package isn't installed ..
fi
在子subshell中通过$(yum .)执行时您正在存储由命令回显的结果(即显示的文本)。
例如:
$> yum list installed | grep vim
vim-common.x86_64 2:8.2.3755-1.fc35 @updates
如果您想要返回代码或退出代码,则可以通过$?
访问。
例如:
$> ls
[...]
$> echo $?
0
$> ls toto
ls: cannot access 'toto': No such file or directory
$> echo $?
2
注意,每个命令都会更改退出代码。
因此,访问两次$?
将改变其值。
$> ls toto
ls: cannot access 'toto': No such file or directory
$> echo $?
2
$> echo $?
0
在这种情况下,您正在测试yum
给出的文本在数学上是否等于0:
chk3=$(yum list installed | grep rpmdev)
if [[ $chk1 -ne 0 && "$chk2" -ne 0 && "$chk3" -ne 0 ]];then
^^^^^^
不可能是因为:
一个或多个包找到了带有包information.
0
.如果您使用测试运行它,则有各种失败的情况:
# note: rpmdevtools is not installed on by computer
$> chk1=$(yum list installed | grep rpmdevtools)
$> test $chk1 -ne 0
bash: test: -ne: unary operator expected
# multiple vim-* packages are installed
$> chk1=$(yum list installed | grep vim)
$> test $chk1 -ne 0
bash: test: too many arguments
发布于 2022-02-04 14:26:27
我对百胜并不熟悉,也许有更好的方法来检查,但这会让你的if语句起作用:
if
yum list installed | grep -q rpmdevtools &&
yum list installed | grep -q rpmbuild &&
yum list installed | grep -q rpmdev
then
我还建议将-w
添加到grep中,以匹配整个单词。
如果yum list installed
是一个缓慢的命令,请考虑将输出保存在一个变量中,并对其进行改进(而不是运行三次):
list=$(yum list installed)
if
echo "$list" | grep -q rpmdevtools &&
echo "$list" | grep -q rpmbuild &&
echo "$list" | grep -q rpmdev
then
发布于 2022-02-05 17:43:45
当前的问题是-ne
检查数值相等;当然,来自grep
的输出不会是0,所以所有检查都失败了。
不管怎样,你似乎把事情搞得太复杂了。yum list installed
还可以选择接受要检查的包列表。
if yum list installed rpmdevtools rpmbuild rpmdev >/dev/null 2>&1
then
echo "$0: package exists" >&1
else
echo "$0: package doesn't exist; installing ..." >&2
sudo yum install -y wget
wget http://mirror.centos.org/centos/7/os/x86_64/Packages/rpmdevtools-8.3-5.el7.noarch.rpm
sudo yum install -y rpmdevtools-8.3-5.el7.noarch.rpm
fi
请注意诊断消息包含脚本名称$0
和打印到标准错误>&2
的约定,以及我们如何避免在中间的sleep
绝对对用户怀有敌意。如果您想让用户有机会决定他们是否真的想继续计划的操作,请显示单独的提示符(在理想情况下,可以从命令行重写,就像yum install -y
允许您说不需要提示符一样)。
https://stackoverflow.com/questions/70987411
复制相似问题