我一定错过了一些关于 Bash read 命令的非常基本的东西。在 shell 提示符下,无法将三个输入字段分配给相应的变量:
% echo a b c | read x1 x2 x3
% echo $x1 $x2 $x3
%
这虽然有效:
% echo a b c | while read x1 x2 x3 ; do
> echo $x1 $x2 $x3
> done
a b c
%
我只需要读取一行输入。此处使用 while 循环是不正确的,因为当循环的子进程退出时,我会丢失 x1、x2 和 x3 的值。我必须将访问它们的所有代码放在循环体中(并且可能在最后中断,为了“清晰”),这看起来非常hackish。在 if 命令中使用它也可以,但会遇到与 while 循环相同的子进程问题:
% echo a b c | if read x1 x2 x3 ; then echo $x1 $x2 $x3; fi
a b c
% echo $x1
BASH_VERSION 报告为“4.2.45(1)-release”。
问题出在管道上。来自 bash 手册:
管道中的每个命令都作为单独的进程执行(即,在
一个子外壳)。
你必须做相反的事情,即打电话read
在当前流程中并在子流程中生成输入。例如:
$ read x1 x2 x3 < <(echo a b c)
$ echo $x1 $x2 $x3
a b c
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)