添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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

通常情况下,在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`的结果。

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

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

命令 输出 结果保存到变量 文章引用:http://blog.csdn.net/csfreebird/article/details/7978699#reply 1.两种实现语法 var=$( 命令 ) var=` 命令 ` # 注意此处不是普通的单逗号 a. 这两种语法均可实现将 命令 执行结果保存到var变量 ,但是特殊情况下两种方式无法得到正确结果 b.如果 命令 执行
将一条 命令 的执行结果取得 命令 执行结果的值有: 1、使用反引号`` (数字键1左边的键,tab键上面,英文方式输入) 如:a=echo "hello world";即将 命令 echo "hello world"的 输出 赋给变量a2、可以使用 (()),如:a=(()),如:a=(()),如:a=(echo “hello world”),即将 命令 echo "hello world"的 输出 赋给变量a。
据说有统计数据表明,代码的缺陷率是一定的,与所使用的语言无关。Linux提供了很多的实用工具和 脚本 ,在程序 调用工具和 脚本 ,无疑可以简化程序,从而降低代码的缺陷数目。Linux shell 脚本 也是一个强大的工具,我们可以根据需要编制 脚本 ,然后在程序 调用自定义 脚本 。   《Unix 编程艺术》 有一句话“一行 Shell 脚本 胜过万行 C”。那么在 Linux 编程 ,C 程序如何调用 shel
代码如下:#! /bin/bash while getopts a:bc optdo  case $opt in    a)      echo “aaa”      echo $OPTARG    b)      echo “bb”    c)      echo “ccc”    *)      echo “error”  esacdone 您可能感兴趣的文章:在 Shell 命令 行处理JSON数据的方法 shell 学习教程 获取 命令 行参数示例神奇的 shell 命令 行输入与 输出 功能介绍Linux 命令 行和 shell 脚本 编程宝典 Richard BlumP
cmddir=”`dirname $0`” 以上这篇 shell 脚本 输出 结果记录到日志文件的实现就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持软件开发网。 您可能感兴趣的文章:linux shell 历史 命令 记录功能用来记录登录后使用 命令 shell 脚本 Power Shell 小技巧之定时记录操作系统行为Power Shell 时间记录 脚本 Power shell 小技巧之记录 脚本 的操作Power shell 小技巧之用变量累积记录错
shell 脚本 获取 参数是指在执行 shell 脚本 时,可以通过 命令 行传递参数给 脚本 脚本 可以 获取 这些参数并进行相应的处理。在 shell 脚本 ,可以使用特殊变量$1、$2、$3等来 获取 命令 行传递的参数,其 $1表示第一个参数,$2表示第二个参数,以此类推。如果需要 获取 所有的参数,可以使用$@或$*来表示。例如,如果执行 脚本 时输入了参数,可以使用以下方式 获取 参数: #!/bin/bash echo "第一个参数为:$1" echo "第二个参数为:$2" echo "所有参数为:$@" 执行 脚本 时,可以输入参数: ./test.sh hello world 输出 结果为: 第一个参数为:hello 第二个参数为:world 所有参数为:hello world