首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在if/else状态中使用变量的grep结果?

如何在if/else状态中使用变量的grep结果?
EN

Stack Overflow用户
提问于 2022-02-04 13:45:23
回答 3查看 321关注 0票数 0

我正在尝试创建一个条件语句,以检查grep是否已安装包。如果为真,则不应安装包,如果为false,则应安装包。我总是得到相同的结果包没有安装,无论我放哪个值,请帮助(在我的情况下,所有的软件包都已安装,并且grep找到一个匹配的。这是代码:

代码语言:javascript
运行
复制
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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-02-04 14:25:53

您在这里混合了两种结果:结果(即显示的文本)和返回值。

TL;DR

可以验证变量$chkX是否与[[ ! -z ${chkX} ]]一起为空,如:

代码语言:javascript
运行
复制
if [[ ! -z ${chk1} ]] && [[ ! -z ${chk2} ]] && [[ ! -z ${chk3} ]]; then
[...]

或者你可以这样做,根据出口代码。

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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 .)执行时您正在存储由命令回显的结果(即显示的文本)。

例如:

代码语言:javascript
运行
复制
$> yum list installed | grep vim
vim-common.x86_64                                 2:8.2.3755-1.fc35                    @updates       

如果您想要返回代码或退出代码,则可以通过$?访问。

例如:

代码语言:javascript
运行
复制
$> ls
[...]
$> echo $?
0
$> ls toto
ls: cannot access 'toto': No such file or directory
$> echo $?
2

注意,每个命令都会更改退出代码。

因此,访问两次$?将改变其值。

代码语言:javascript
运行
复制
$> ls toto
ls: cannot access 'toto': No such file or directory
$> echo $?
2
$> echo $?
0

在这种情况下,您正在测试yum给出的文本在数学上是否等于0:

代码语言:javascript
运行
复制
chk3=$(yum list installed | grep rpmdev)
if [[ $chk1 -ne 0 && "$chk2" -ne 0 && "$chk3" -ne 0 ]];then
                                             ^^^^^^

不可能是因为:

一个或多个包找到了带有包information.

  • and的->单行或多行文本,您将永远得不到0.

如果您使用测试运行它,则有各种失败的情况:

代码语言:javascript
运行
复制
# 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
票数 0
EN

Stack Overflow用户

发布于 2022-02-04 14:26:27

我对百胜并不熟悉,也许有更好的方法来检查,但这会让你的if语句起作用:

代码语言:javascript
运行
复制
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是一个缓慢的命令,请考虑将输出保存在一个变量中,并对其进行改进(而不是运行三次):

代码语言:javascript
运行
复制
list=$(yum list installed)

if
    echo "$list" | grep -q rpmdevtools &&
    echo "$list" | grep -q rpmbuild &&
    echo "$list" | grep -q rpmdev
then
票数 0
EN

Stack Overflow用户

发布于 2022-02-05 17:43:45

当前的问题是-ne检查数值相等;当然,来自grep的输出不会是0,所以所有检查都失败了。

不管怎样,你似乎把事情搞得太复杂了。yum list installed还可以选择接受要检查的包列表。

代码语言:javascript
运行
复制
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允许您说不需要提示符一样)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70987411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档