Bash脚本 - 获取系统输出并将其用作变量

时间:2010-09-06 04:39:17

标签: bash db2 grep

非常简单的问题,我在执行命令后尝试获取一些输出并再次使用它。

#!/bin/bash
echo what's the source db name?
read SOURCE
echo what's the target db name?
read TARGET
db2 backup db $SOURCE online compress include logs
READ SOME OF THIS LINE = SOURCE
db2 restore database $SOURCE taken at $DB2TIME into $TARGET

“读取此行的一部分”这一行输出如下: 备份成功。此备份映像的时间戳为:20100906142221 我认为grep命令会这样做,但我不是100%肯定

3 个答案:

答案 0 :(得分:0)

bash中,您使用$()捕获命令的输出(或反引号,但我更喜欢前者,因为您可以嵌套它们):

pax> xx=$(ls -1 | grep bac)

pax> echo "..${xx}.."
..backup0.sh
backup1.sh..

所以,在你的特定情况下,你会看到类似的东西:

timestamp=$(db2 backup db $SOURCE online compress include logs 2>&1
    | tee /tmp/output
    | grep 'image is'
    | awk '{print $11}')

请记住,为了便于阅读,我将其划分为多行,但它应该在单行上。至于它是如何工作的:

  • 2>&1结合了标准输出和错误。
  • tee将确保您将整个输出存储在某处。
  • grep将为您提供相关的一行。
  • awk只打印出20100906142221
  • xx=$(...)会将其分配给xx

如果您的输出与您所说的略有不同,您可能需要对某些命令进行微调,但这应该是一个良好的开端。


根据评论,以下是您需要开始的内容:

#!/bin/bash
echo what's the source db name?
read SOURCE
echo what's the target db name?
read TARGET
db2 backup db $SOURCE online compress include logs 2>&1 | tee /tmp/db_bkp_$$
DB2TIME=$(cat /tmp/db_bkp_$$ | grep 'image is' | awk '{print $11}')
rm -rf /tmp/db_bkp_$$
db2 restore database $SOURCE taken at $DB2TIME into $TARGET

这将执行DB2命令向终端发送输出和错误临时文件($$为您提供当前进程ID以避免文件名冲突)。然后从临时文件中提取日期/时间,然后删除该文件。

然后你使用日期/时间。

答案 1 :(得分:0)

继续@ pax的回答,您的代码现在变为:

#!/bin/bash
echo what's the source db name?
read SOURCE
echo what's the target db name?
read TARGET
DB2TIME=$(db2 backup db $SOURCE online compress include logs)
# you have read it above <--- READ SOME OF THIS LINE = SOURCE
db2 restore database $SOURCE taken at $DB2TIME into $TARGET

答案 2 :(得分:0)

@pax @dennis @pavanlimo对不起我在写这篇文章时写了一个错字,

执行后我需要能够读取$ DB2TIME:

db2 backup db $SOURCE online compress include logs

我得到了输出:

The timestamp for this backup image is : 20100906142221

我需要将20100906142221转换为$ DB2TIME,以便我可以执行下一个命令

db2 restore database $SOURCE taken at $DB2TIME into $TARGET