【发布时间】:2011-12-02 07:50:37
【问题描述】:
当我尝试像这样在 Bash 中使用 read 命令时:
echo hello | read str
echo $str
没有回显,而我认为str 应该包含字符串hello。有人可以帮我理解这种行为吗?
【问题讨论】:
当我尝试像这样在 Bash 中使用 read 命令时:
echo hello | read str
echo $str
没有回显,而我认为str 应该包含字符串hello。有人可以帮我理解这种行为吗?
【问题讨论】:
脚本命令中的read 很好。但是,您在管道中执行它,这意味着它位于子 shell 中,因此,它读取的变量在父 shell 中不可见。你可以
将脚本的其余部分也移动到子shell中:
echo hello | { read str
echo $str
}
或使用命令替换从子shell中获取变量的值
str=$(echo hello)
echo $str
或者稍微复杂一点的例子(抓取ls的第二个元素)
str=$(ls | { read a; read a; echo $a; })
echo $str
【讨论】:
ls 的second 项。使用单个read a,您将获得第一项。不要问我为什么回答者选择了这个例子。
该值消失,因为读取命令在单独的子 shell 中运行:Bash FAQ 24
【讨论】:
你需要管道吗?
echo -ne "$MENU"
read NUMBER
【讨论】:
echo 和read 命令没有以任何方式连接。
其他不涉及子外壳的 bash 替代方案:
read str <<END # here-doc
hello
END
read str <<< "hello" # here-string
read str < <(echo hello) # process substitution
【讨论】:
read A B C <<< $(echo 'aaa bbb ccc')
典型用法可能如下所示:
i=0
echo -e "hello1\nhello2\nhello3" | while read str ; do
echo "$((++i)): $str"
done
和输出
1: hello1
2: hello2
3: hello3
【讨论】:
把我的两分钱放在这里:在 KSH 上,reading 对变量将起作用,因为根据the IBM AIX documentation,KSH 的read 确实 影响当前的shell环境:
read命令设置shell变量会影响当前shell执行环境。
这只是让我花了几分钟时间弄清楚为什么我之前在 AIX 上使用过无数次的以 read 结尾的单行代码在 Linux 上不起作用...这是因为 KSH 确实可以节省到当前环境,而 BASH 没有!
【讨论】:
另一种选择是使用 printf 函数。
printf -v str 'hello'
此外,这种结构结合在适当情况下使用单引号有助于避免子shell 和其他形式的插值引用的多重转义问题。
【讨论】:
str='hello。我认为这里的重点是将命令的输出捕获到变量中。
我真的只使用带有“while”和do循环的read:
echo "This is NOT a test." | while read -r a b c theRest; do
echo "$a" "$b" "$theRest"; done
这是一个测试。
对于它的价值,我已经看到了在 bash 中始终将 -r 与 read 命令一起使用的建议。
【讨论】:
你不需要 echo 来使用 read
read -p "Guess a Number" NUMBER
【讨论】: