shell 脚本中获取命令的输出的实现示例

 更新时间:2022年02月25日 10:18:35   作者:歪歪的酒壶  
本文主要介绍了shell 脚本中获取命令的输出的实现示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

这个主要介绍的方法是获取命令的输出内容,而不是命令执行成功与否的返回值。

通常情况下,在shell脚本中需要获取命令的输出内容,然后根据输出内容判断下一步的执行操作。

比较常用的一种方式就是, 匹配命令输出的内容中是否存在某些关键字,选择执行的不同动作。
比较常用的一种方式就是采用反向单引号的方式 --  保存结果的变量名=`需要执行的linux命令`

这种方式在使用时,有些细节的地方需要注意。 先用几个例子来说明一下。

比如在CentOS7环境中,使用rpm -qa命令查询某些rpm包是否安装,没有安装的话进行安装操作。

举个简单的例子来说:

#!/bin/bash

check_results=`rpm -qa | grep "zlib"`
echo "command(rpm -qa) results are: $check_results"
if [[ $check_results =~ "zlib" ]] 
then 
    echo "package zlib has already installed. "
else 
    echo "This is going to install package zlib"
 fi

保存为test.sh文件,然后运行

$bash test.sh 

结果为:

command(rpm -qa) results are: zlib-1.2.7-13.el7.x86_64
package zlib has already installed. 

这个脚本基本上是可以工作的。

那么,我们同样使用类似的方式来检查iscsi-initiator软件包是否安装。 与上一个命令不同的是,这个命令是否安装不能通过rpm -qa命令获取。

我们采取另一种方式

#!/bin/bash
check_results=`iscsiadm --version | grep iscsiadm`
echo "check command(iscsiadm) available results are: $check_results"
if [[ $check_results =~ "iscsiadm" ]] 
then 
    echo "command iscsiadm could be used already."
else     
    echo "command iscsiadm can't be used. Install it"
    rpm -ivh iscsi-initiator-utils-6.2.0.873-29.el7.x86_64.rpm
fi

执行的结果为:

$ bash test.sh
check command(iscsiadm) available results are: iscsiadm version 6.2.0.873-28
command iscsiadm could be used already.

这时候看起来脚本是工作正常的,显示iscsiadm已经可用。那么假如一开始的时候iscsiadm命令不可用呢?

我们可以将上面的check_results=`iscsiadm --version | grep iscsiadm`改成为check_results=`iscsiadmm --version | grep iscsiadm`

这样我们故意将命令写错,模拟命令没有安装的情况下脚本的运行。

修过后执行结果如下

$ bash test.sh
test.sh: line 2: iscsiadmm: command not found
check command(iscsiadm) available results are: 
command iscsiadm can't be used. Install it

看起来好像也是工作正常的,但是为什么check_results的内容为空呢? 难道不应该将“command not found: iscsiadmm”内容赋值给check_results,然后打印显示出来吗?

我们将iscsiadmm --version | grep iscsiadm单独在命令行中执行,也是有输出的啊,为什么不能赋值成功呢?

这个时候如果我们在命令执行完毕之后,执行命令echo$? 这个时候得到的值为127(Centos7系统)。在命令行中单独执行scsiadm --version | grep iscsiadm命令之后,执行echo $?得到的值为0(Centos7系统)

从这里可以看出在使用··(2个反向单引号)的方式获取执行结果时需要保证单引号内的命令是可以执行成功的。

就算是这样就能保证我们可以获取到想要的内容吗? 不一定,再来看个例子。

#!/bin/bash
check_results=`java -version`
echo "check java version results are: $check_results"
if [[ $check_results =~ "1.8." ]] 
then 
    echo "java version is 1.8, it seems not need to install java again."
else     
    echo "It is going to install jdk 1.8 version"
fi

执行结果为:

$ bash test.sh                                                                                 
java version "1.8.0_73"
Java(TM) SE Runtime Environment (build 1.8.0_73-b02)
Java HotSpot(TM) 64-Bit Server VM (build 25.73-b02, mixed mode)
check java version results are: 
It is going to install jdk 1.8 version

怎么回事?命令jdk已经安装了,为什么还是没有匹配到呢?根据第二个例子,我们手动执行命令 java -version 然后执行命令$? 得到的结果为0, 说明命令是执行成功的。怎么还是没有获取到命令的输出呢?

这个现象出现的原因是有可能命令的执行结果被重定向了。

试着将check_results=`java -version` 改成check_results=`java -version 1> /dev/stdout` 和 check_results=`java -version 2> /dev/sdtout` 看看输出是否有变化

为了防止这种情况的发生,最终我们将上面改成check_results=`java -version 2>&1` 这样得到了想要的结果。

使用  保存结果的变量名=`需要执行的linux命令` 这种方式来获取命令的输出时,注意的情况总结如下:

1)保证反单引号内的命令执行时成功的,也就是所命令执行后$?的输出必须是0,否则获取不到命令的输出

2)即便是命令的返回值是0,也需要保证结果是通过标准输出来输出的,而不是标准错误输出,否则需要重定向

因此我们推荐使用  保存结果的变量名=`需要执行的linux命令 2>&1 `的方式来获取命令的执行结果。

感兴趣的朋友可以试下第二个例子中改成  check_results=`iscsiadmm --version 2>&1`的结果。

此外还有一种获取命令执行返回值的方式 变量名=$(需要执行的命令) 对于这种方式没有进行测试,所以不再此讨论。

对于上面提到的获取命令执行输出的情况,和获取函数执行结果的方式并不同,请在使用中进行注意。

到此这篇关于shell 脚本中获取命令的输出的实现示例的文章就介绍到这了,更多相关shell 脚本中获取命令输出内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • linux上搭建solr的实现方法(用jetty部署)

    linux上搭建solr的实现方法(用jetty部署)

    下面小编就为大家分享一篇linux上搭建solr的实现方法(用jetty部署),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • Idea使用Bashsupport插件编辑Shell脚本的方法

    Idea使用Bashsupport插件编辑Shell脚本的方法

    这篇文章主要介绍了Idea插件之——Bashsupport编辑Shell脚本的相关知识,功能非常齐全有检查错误并且还可以在idea中直接运行shell脚本,本教程带领大家一步步演示插件的安装和配置,需要的朋友可以参考下
    2021-05-05
  • 详解Shell $*和$@之间的区别

    详解Shell $*和$@之间的区别

    这篇文章主要介绍了详解Shell $*和$@之间的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Shell脚本编程30分钟入门(小结)

    Shell脚本编程30分钟入门(小结)

    这篇文章主要介绍了Shell脚本编程30分钟入门(小结),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-05-05
  • Shell脚本对文件中的行、单词、字符进行迭代输出示例

    Shell脚本对文件中的行、单词、字符进行迭代输出示例

    这篇文章主要介绍了Shell脚本对文件中的行、单词、字符进行迭代输出示例,本文讲解了迭代文件中的每一行、迭代一行中的每一个单词、迭代一个单词中的每一个字符等内容,需要的朋友可以参考下
    2014-11-11
  • 十三个写好shell脚本的技巧分享

    十三个写好shell脚本的技巧分享

    这篇文章主要给大家介绍了关于写好shell脚本的13个技巧的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-06-06
  • 关于Shell脚本效率优化的一些个人想法

    关于Shell脚本效率优化的一些个人想法

    很想像之前的一片Mysql全面优化详解那样子写一篇全面的优化文章,但是苦于没有相关书籍参考,也没有发现网络牛人有总结帖或文章之类的,所以就根据个人理解和经验写一些能优化程序效率的东西吧。这篇是不敢称全面的
    2012-09-09
  • Linux Shell脚本系列教程(二):终端打印命令详解

    Linux Shell脚本系列教程(二):终端打印命令详解

    这篇文章主要介绍了Linux Shell脚本系列教程(二):终端打印命令详解,本文着重讲解了echo终端打印、printf终端打印两个打印出输出命令,需要的朋友可以参考下
    2015-06-06
  • shell脚本将Oracle服务器中数据定时增量刷新到ftp服务器中

    shell脚本将Oracle服务器中数据定时增量刷新到ftp服务器中

    这篇文章主要介绍了shell脚本将Oracle服务器中数据定时增量刷新到ftp服务器中,非常不错,具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2019-08-08
  • shell性能测试脚本优化的技巧

    shell性能测试脚本优化的技巧

    这篇文章主要介绍了shell性能测试脚本优化技巧,本文通过实例截图的形式给大家展示,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02

最新评论