Bash 读取命令在循环外不起作用

标签 bash shell input

我一定是遗漏了一些关于 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 的值。我必须将所有访问它们的代码放在循环体内(为了“清晰”,可能在最后中断),这看起来很老套。在 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 手册:

Each command in a pipeline is executed as a separate process (i.e., in a subshell).

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

$ read x1 x2 x3 < <(echo a b c)
$ echo $x1 $x2 $x3
a b c

关于Bash 读取命令在循环外不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19052083/

相关文章:

linux - 查找所有者或组不等于的地方

linux - 在 Shell 脚本中根据 curl 输出分配变量

linux - 遍历数组,使用内容作为文件输出

perl - 如何使用Net::OpenSSH安全地写入远程文件

c - Atmel Studio AtTiny104 - 简单代码

c# - 响应多个 KeyDown 事件

bash - Expect 脚本不会将日期命令的 bash 替换扩展为 send

bash - [] 和 () 在 "if"条件下的区别

input - 批处理和改组填充 tf.train.SequenceExample

bash - 我怎样才能grep变量中的复杂字符串?