如何在Bash中使用read命令?

如何在Bash中使用read命令?,bash,built-in,Bash,Built In,当我尝试在Bash中使用read命令时,如下所示: echo hello | read str echo $str 没有回声,而我认为str应该包含字符串hello。有人能帮我理解这个行为吗?脚本命令中的读取很好。但是,您在管道中执行它,这意味着它在子shell中,因此,它读取到的变量在父shell中不可见。你也可以 在子shell中也移动脚本的其余部分: echo hello | { read str echo $str } 或者使用命令替换从子shell中获取变量的值 str=$

当我尝试在Bash中使用
read
命令时,如下所示:

echo hello | read str
echo $str

没有回声,而我认为
str
应该包含字符串
hello
。有人能帮我理解这个行为吗?

脚本命令中的
读取
很好。但是,您在管道中执行它,这意味着它在子shell中,因此,它读取到的变量在父shell中不可见。你也可以

  • 在子shell中也移动脚本的其余部分:

    echo hello | { read str
      echo $str
    }
    
  • 或者使用命令替换从子shell中获取变量的值

    str=$(echo hello)
    echo $str
    
    或者一个稍微复杂一点的例子(抓住ls的第二个元素)


由于read命令在单独的子shell中运行,因此该值将消失:

是否需要管道

echo -ne "$MENU"
read NUMBER

不涉及子shell的其他bash替代方案:

read str <<END             # here-doc
hello
END

read str <<< "hello"       # here-string

read str < <(echo hello)   # process substitution

read str典型用法可能如下所示:

i=0
echo -e "hello1\nhello2\nhello3" | while read str ; do
    echo "$((++i)): $str"
done
和输出

1: hello1
2: hello2
3: hello3

在这里我想说的是:在KSH上,
read
ing as is To a variable将起作用,因为根据,KSH的
read
确实会影响当前的shell环境:

通过read命令设置shell变量会影响当前shell执行环境


这让我花了好几分钟来弄清楚为什么我以前在AIX上使用过无数次的以
read
结尾的一行程序在Linux上不起作用。。。这是因为KSH会保存到当前环境,而BASH不会

另一种选择是使用printf函数

printf -v str 'hello'

此外,这种构造,再加上适当使用单引号,有助于避免子shell和其他形式的插值引号的多重转义问题。

我实际上只使用带“while”的read和do循环:

echo "This is NOT a test." | while read -r a b c theRest; do  
echo "$a" "$b" "$theRest"; done  
这是一个测试。

值得一提的是,我看到了在bash中始终将-r与read命令一起使用的建议

-1:您的
echo
read
命令没有以任何方式连接。海报显然需要一种自动方式来填充变量,而无需手动输入。非常棒的示例!我确实需要在OSX上稍微调整一下,在花括号内加空格,在echo后加分号,比如:str=$(ls |{read a;read a;echo$a;})@javadba:不需要两次。给定的示例从
ls
返回第二项。用一个
读一个
,你就会得到第一项。不要问我为什么回答者选择了这个例子。要将三个(或更多)IFS分隔的列读入变量,可以执行“read VAR_1 VAR_2 VAR_3”。这一直困扰着我。应该记录在手册页中。如果这就是您想要实现的目标,那么您最好执行
str='hello
。我认为这里的要点是将命令的输出捕获到一个变量中。您也可以对here字符串使用一个进程,例如
readabc-Related:and。
echo "This is NOT a test." | while read -r a b c theRest; do  
echo "$a" "$b" "$theRest"; done