5

我一定遗漏了关于 Bash 读取命令的一些非常基本的内容。在 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”。

4

2 回答 2

11

问题是管道。来自 bash 手册:

管道中的每个命令都作为单独的进程执行(即,在子shell 中)。

您必须进行反向操作,即调用read当前流程并在子流程中生成输入。例如:

$ read x1 x2 x3 < <(echo a b c)
$ echo $x1 $x2 $x3
a b c
于 2013-09-27T13:38:56.787 回答
2

read是在 bash 子进程中运行的 bash 内置命令。它在该子流程中设置环境变量,因此当您检查原始流程中的值时,没有任何更改。

于 2013-09-27T13:42:34.910 回答