我有这样的剧本
genhash --use-ssl -s $IP -p 443 --url $URL | grep MD5 | grep -c $MD5
Run Code Online (Sandbox Code Playgroud)
我想在变量中获取genhash生成的流.如何将其重定向到变量$hash
以在条件内进行比较?
if [ $hash -ne 0 ]
then echo KO
exit 0
else echo -n OK
exit 0
fi
Run Code Online (Sandbox Code Playgroud)
小智 315
使用$( ... )
构造:
hash=$(genhash --use-ssl -s $IP -p 443 --url $URL | grep MD5 | grep -c $MD5)
Run Code Online (Sandbox Code Playgroud)
Bru*_*sky 200
TL; DR
存储"abc"
到$foo
:
echo "abc" | read foo
Run Code Online (Sandbox Code Playgroud)
但是,因为管道会产生叉子,所以必须$foo
在管道末端之前使用,所以......
echo "abc" | ( read foo; date +"I received $foo on %D"; )
Run Code Online (Sandbox Code Playgroud)
当然,所有这些其他答案显示了不做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
Run Code Online (Sandbox Code Playgroud)
让我们假装这series | of | commands
是一系列非常复杂的管道命令.
mystic_command
可以接受文件的内容作为stdin来代替文件路径,但不能接受--opt
arg因此它必须作为变量.该命令输出修改后的内容,通常会重定向到文件或管道传输到另一个命令.(例如sed
,awk
,perl
等等)
read
接受stdin并将其放入变量中 $string
通过括号将read
和mystic_command
放入"子shell"不是必需的,但使其像连续管道一样流动,就好像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
Run Code Online (Sandbox Code Playgroud)
我的方式完全是按时间顺序排列的.替代方案从第4个命令开始,并将命令1,2和3推送到命令替换中.
我在这个剧本中有一个真实世界的例子,但我没有用它作为上面的例子,因为它还有一些其他疯狂/混乱/分散注意力的bash魔法.
小智 58
read hash < <(genhash --use-ssl -s $IP -p 443 --url $URL | grep MD5 | grep -c $MD5)
Run Code Online (Sandbox Code Playgroud)
这种技术使用Bash的" 进程替换 ",不要与" 命令替换 " 混淆.
以下是一些很好的参考:
ony*_*ony 18
我想兼容的方式:
hash=`genhash --use-ssl -s $IP -p 443 --url $URL | grep MD5 | grep -c $MD5`
Run Code Online (Sandbox Code Playgroud)
但是我更喜欢
hash="$(genhash --use-ssl -s $IP -p 443 --url $URL | grep MD5 | grep -c $MD5)"
Run Code Online (Sandbox Code Playgroud)
小智 6
如果管道太复杂而无法包装$(...)
,请考虑编写一个函数。定义时可用的任何局部变量都可访问。
function getHash {
genhash --use-ssl -s $IP -p 443 --url $URL | grep MD5 | grep -c $MD5
}
hash=$(getHash)
Run Code Online (Sandbox Code Playgroud)
http://www.gnu.org/software/bash/manual/bashref.html#Shell-Functions
你可以做:
hash=$(genhash --use-ssl -s $IP -p 443 --url $URL)
Run Code Online (Sandbox Code Playgroud)
或者
hash=`genhash --use-ssl -s $IP -p 443 --url $URL`
Run Code Online (Sandbox Code Playgroud)
如果要将整个管道的结果分配给变量,可以在上面的赋值中使用整个管道。
归档时间: |
|
查看次数: |
278688 次 |
最近记录: |