我如何重定向输出到一个变量在shell?

我有一个这样的剧本

genhash --use-ssl -s $IP -p 443 --url $URL | grep MD5 | grep -c $MD5

我想在变量中获得由genhash生成的流。如何将其重定向到变量$hash以在条件内进行比较?

if [ $hash -ne 0 ]
then echo KO
exit 0
else echo -n OK
exit 0
fi
396393 次浏览

使用$( ... )结构:

hash=$(genhash --use-ssl -s $IP -p 443 --url $URL | grep MD5 | grep -c $MD5)

你可以:

hash=$(genhash --use-ssl -s $IP -p 443 --url $URL)

hash=`genhash --use-ssl -s $IP -p 443 --url $URL`

如果你想将整个管道的结果赋值给变量,你可以在上面的赋值中使用整个管道。

我想合适的方式是:

hash=`genhash --use-ssl -s $IP -p 443 --url $URL | grep MD5 | grep -c $MD5`

但我更喜欢

hash="$(genhash --use-ssl -s $IP -p 443 --url $URL | grep MD5 | grep -c $MD5)"
read hash < <(genhash --use-ssl -s $IP -p 443 --url $URL | grep MD5 | grep -c $MD5)

该技术使用Bash的“进程替换”,不要与“命令替换”混淆。

这里有一些很好的参考:

博士TL;

"abc"存储到$foo中:

echo "abc" | read foo

但是,因为管道会创建分叉,所以必须在管道结束之前使用$foo,所以…

echo "abc" | ( read foo; date +"I received $foo on %D"; )

当然,所有这些其他答案都显示了不去做OP要求的方法,但这真的把我们这些搜索OP问题的人搞砸了。

这个问题的答案是使用read命令。

你可以这样做

# I would usually do this on one line, but for readability...
series | of | commands \
| \
(
read string;
mystic_command --opt "$string" /path/to/file
) \
| \
handle_mystified_file

以下是它正在做的事情以及为什么它很重要:

  1. 让我们假设series | of | commands是一系列非常复杂的管道命令。

  2. mystic_command可以接受文件的内容作为stdin而不是文件路径,但而不是--opt参数因此它必须作为变量进来。该命令输出修改后的内容,通常会被重定向到一个文件中或通过管道传输到另一个命令。(例如sedawkperl等)

  3. read接受stdin并将其放入变量$string

  4. readmystic_command放入“;sub shell"Via圆括号是不必要的,但使它像一个连续的管道,就好像2个命令在一个单独的脚本文件。

总有一种选择,在这种情况下,与我上面的例子相比,这种选择既丑陋又难以阅读。

# my example above as a oneliner
series | of | commands | (read string; mystic_command --opt "$string" /path/to/file) | handle_mystified_file


# ugly and unreadable alternative
mystic_command --opt "$(series | of | commands)" /path/to/file | handle_mystified_file

我的方式完全是按时间顺序排列和逻辑。替代方案从第4个命令开始,将命令1、2和3推入命令替换。

我在这个脚本中有一个真实世界的例子,但我没有使用它作为上面的例子,因为它还有一些其他疯狂/混乱/分散注意力的bash魔法。

如果管道太复杂,无法在$(...)中包装,可以考虑编写一个函数。定义时可用的任何局部变量都可以访问。

function getHash {
genhash --use-ssl -s $IP -p 443 --url $URL | grep MD5 | grep -c $MD5
}
hash=$(getHash)

http://www.gnu.org/software/bash/manual/bashref.html#Shell-Functions

我在使用$(`code`)构造函数时有时会出错。

最后,我在这里得到了一些方法:https://stackoverflow.com/a/7902174/2480481

基本上,使用Tee再次读取输出并将其放入变量中。 这就是你如何看到正常输出,然后从输出中读取它

不是吗?我猜你当前的任务genhash会输出一个字符串散列,所以可能对你有用。

我是如此的菜鸟,仍然在寻找完整的输出&保存为1个命令。 问候。< / p >

创建一个函数,将其作为要调用的命令调用。在这种情况下,我需要使用ruok命令。

然后,调用该函数并将其结果赋值给一个变量。在本例中,我将结果赋值给变量健康

function ruok {
echo ruok | nc *ip* 2181
}


health=echo ruok *ip*