linux捕获命令结果 linux获取命令执行结果

如何捕获在C#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
【linux捕获命令结果 linux获取命令执行结果】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

推荐阅读