如何在Bash中使用read命令?
当我尝试在Bash中使用如何在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=$
read
命令时,如下所示:
echo hello | read str
echo $str
没有回声,而我认为
str
应该包含字符串hello
。有人能帮我理解这个行为吗?脚本命令中的读取
很好。但是,您在管道中执行它,这意味着它在子shell中,因此,它读取到的变量在父shell中不可见。你也可以
- 在子shell中也移动脚本的其余部分:
echo hello | { read str echo $str }
- 或者使用命令替换从子shell中获取变量的值
或者一个稍微复杂一点的例子(抓住ls的第二个元素)str=$(echo hello) echo $str
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