这个主要介绍的方法是获取命令的输出内容,而不是命令执行成功与否的返回值。
通常情况下,在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