非常简单的问题,我在执行命令后尝试获取一些输出并再次使用它。
#!/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%肯定
答案 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