如何将输出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
这是它在做什么,为什么它是重要的:
-
让我们假装
series | of | commands
series | of | commands
series | of | commands
是一个非常复杂的pipe道命令序列。 -
mystic_command
可以接受一个文件的内容作为标准input代替文件path,而不是--opt
arg,因此它必须作为一个variables进来。 该命令输出修改后的内容,通常会被redirect到一个文件或者通过pipe道传送到另一个命令。 (例如sed
,awk
,perl
等) -
read
stdin并将其放入variables$string
-
通过括号把
read
和mystic_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命令。 问候。