我有一个类似于这样的脚本
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
我有一个类似于这样的脚本
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
$( ... )
结构:hash=$(genhash --use-ssl -s $IP -p 443 --url $URL | grep MD5 | grep -c $MD5)
result=$(( $your_command ) 2>&1)
- Katie$( ... )
时,它会使用一个新的子shell,因此命令的结果可能与主shell中的结果不同。 - Andrey Izman$(...)
内打印命令的退出码,那将非常有帮助。 - Olsgaard简而言之
将 "abc"
存储到 $foo
中:
echo "abc" | read foo
但是,由于管道会创建进程,所以必须在管道结束之前使用$foo
,因此...
echo "abc" | ( read foo; date +"I received $foo on %D"; )
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
是一系列非常复杂的管道命令。
mystic_command
可以接受文件内容作为标准输入,而不是文件路径,但不能使用 --opt
参数,因此必须将其作为变量输入。该命令输出修改后的内容,并通常被重定向到文件或传递给另一个命令。(例如 sed
、awk
、perl
等)
read
获取标准输入并将其放入变量 $string
中
将 read
和 mystic_command
放入括号中的“子 shell”中并不是必需的,但使其像连续的管道一样流动,就好像这两个命令在单独的脚本文件中一样。
总是有替代方案,在这种情况下,与我上面的示例相比,替代方案很丑陋且难以阅读。
# 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
read
操作在子进程中进行,无法影响父进程中的变量,因此似乎这是不可能的。我正在尝试使用tee
来拆分进程的输出,并通过将一个进程的输出作为另一个进程的参数来“重新连接”tee
分割的进程。 - user001echo "test" | (read ROLE_X; echo $ROLE_X )
关于此分支的更多信息请参见 https://dev59.com/CmYr5IYBdhLWcg3wVYwg#13764018。 - Bruno Bronoskyls | (read $x; echo $x)
只会输出 ls 输出的第一行。因为 'read' 命令不能读取多于一行的输出。 - Phil Goetzread -d '' string
。 - Bruno Bronosky<(…)
的使用,因为它非常棒。原帖应该给出一个解释。基本上,它可以运行子进程,但不是将其传递,而是返回一个文件描述符。这使您可以在需要文件的地方使用命令。例如(作为root):vimdiff /etc/sysconfig/iptables <(iptables-save)
,这最终会打开一个类似于/proc/23565/fd/63
的文件名。是的,vim
可以接受-
作为文件名并从stdin
读取,但那只是一个例子。很多事情都不使用-
或者用<()
允许的命令顺序更加易读。 - Bruno Bronosky我猜这是一种兼容的方式:
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)"
$(...)
周围不需要引号。 - nikolayecho $hash
。但是,如果您执行hash=$(echo '*'0); echo "$hash"
,它将保持*
不变。 - onyab=($(echo a b))
。否则它将被分配为字符串。 - ony如果一个管道太复杂,无法用$(...)
包装,请考虑编写一个函数。在定义时可用的任何本地变量都将是可访问的。
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=$(getHash.sh)
-- shell脚本将在新终端中可用,即使在重新启动后也是如此。 - Able Mac您可以进行以下操作:
hash=$(genhash --use-ssl -s $IP -p 443 --url $URL)
或者
hash=`genhash --use-ssl -s $IP -p 443 --url $URL`
有时候我在使用$(`code`)
构造函数时会出现错误。
最终,我在这里找到了一些解决方法:https://dev59.com/WWsz5IYBdhLWcg3wbHTG#7902174
基本上,使用Tee重新读取输出并将其放入变量中。这样你就可以看到正常的输出,然后从输出中读取它。
是这样吗?我猜你当前的任务genhash只会输出一个字符串哈希,所以可能适合你。
我是个新手,仍在寻找完整的输出和保存到一个命令中的方法。 谢谢。
function ruok {
echo ruok | nc *ip* 2181
}
health=echo ruok *ip*