bash的read命令与stdin

27 浏览
0 Comments

bash的read命令与stdin

我想读取一行文本并将其拆分,所以我决定使用read命令。\n当我尝试像这样做时,\n

$ echo 'a b c d' | while read -a VARARR ; do echo ${VARARR[@]}; done
a b c d

\n一切都正常,但是好像while命令是多余的,所以我尝试了\n

$ echo 'a b c d' | read -a VARARR

\n但是,这不起作用。\n为什么?

0
0 Comments

bash的read命令是在标准输入(stdin)中读取用户输入的一行文本。然而,有时候在使用read命令时会出现一些问题,例如当read命令嵌套在管道命令中时,会导致无法修改父shell的变量。

通过阅读这里的解答,我们可以找到这个问题出现的原因和解决方法:

原因是,管道命令中的命令会在子shell中运行,而子shell不能修改父shell的变量。因此,read命令无法将用户输入的值存储到父shell的变量中。

解决方法是使用重定向操作符(<和<<)将用户输入的值传递给read命令。重定向操作符可以将文件或命令的输出重定向到标准输入(stdin)。通过这种方式,read命令可以直接从重定向的输入中读取值,而不需要嵌套在管道命令中。

下面是一个示例代码,演示了如何使用重定向操作符解决read命令在管道命令中无法修改父shell变量的问题:

#!/bin/bash
# 重定向用户输入到read命令
read_var=$(cat | read input; echo $input)
# 输出读取到的值
echo "用户输入的值为: $read_var"

在上述代码中,使用了cat命令将标准输入重定向到read命令。然后,在read命令内部使用了子shell来接收用户输入,并通过echo命令将输入的值传递给父shell。最后,通过echo命令输出读取到的值。

通过使用重定向操作符,我们可以绕过子shell的限制,将用户输入的值传递给read命令,并将其存储到父shell的变量中。

总结起来,当使用bash的read命令时,如果遇到read命令嵌套在管道命令中无法修改父shell变量的问题,可以通过使用重定向操作符将用户输入的值传递给read命令,从而解决这个问题。

0