如何将输出redirect到shell中的variables?

我有这样的脚本

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

我想要得到一个variablesgenhash生成的stream。 我如何redirect到一个variables$hash比较里面的条件?

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

使用$( ... )构造:

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

当然,所有这些其他的答案都显示了不要做OP所要求的方法,但是这真的使我们其他人searchOP的问题变得麻烦。

这个问题的答案是使用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 series | of | commands series | of | commands是一个非常复杂的pipe道命令序列。

  2. mystic_command可以接受一个文件的内容作为标准input代替文件path,而不是--opt arg,因此它必须作为一个variables进来。 该命令输出修改后的内容,通常会被redirect到一个文件或者通过pipe道传送到另一个命令。 (例如sedawkperl等)

  3. read stdin并将其放入variables$string

  4. 通过括号把readmystic_command放到一个“sub shell”中是没有必要的,但是它使得它像一个连续的pipe道一样stream动,就像2个命令在单独的脚本文件中一样。

总是有另一种select,在这种情况下,替代是丑陋的和不可读的:

 mystic_command --opt "$(series | of | commands)" /path/to/file | handle_mystified_file 

相比

 series | of | commands | (read string; mystic_command --opt "$string" /path/to/file) | handle_mystified_file 

这完全是按时间顺序和逻辑的。

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

这种技术使用Bash的“ 过程replace ”不要与“ 命令replace ”混淆。

这里有几个很好的参考:

我猜兼容的方式:

 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)" 

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

 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

你可以做:

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

要么

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

如果要将整个pipe道的结果分配给该variables,则可以在上述任务中使用整个pipe道。

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

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

基本上,使用三通来读取输出并将其放入一个variables。 Theres你如何看到正常的输出,然后从输出中读取它。

不是? 我猜你目前的任务genhash会输出这个,一个单一的string散列,所以可能会为你工作。

我如此neewbie仍然在寻找完整的输出和保存到1命令。 问候。