作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是在 bash 中将多行输入读取到数组中的正确方法吗?
arr=( $(cat) );
echo "{arr[@]}"
我将这一行放入脚本中,并尝试通过在每一行之后按回车键来读取多个输入,但是脚本继续获取输入并且不会通过进入第二行来打印数组的元素,当我在输入控制台按 ctrl C 脚本终止。请建议从命令行读取多行输入的正确方法是否正确?
最佳答案
几个要点:
首先,不要使用 Ctrl-C,而是使用 Ctrl-D 来结束输入:Ctrl-C 会中断脚本(它发送 SIGINT 信号),而 Ctrl-D 是 EOF(传输结束)。
要打印数组,每行一个字段,使用
printf '%s\n' "${arr[@]}"
现在,坏方法:
arr=( $(cat) )
printf '%s\n' "${arr[@]}"
这很糟糕,因为它受到分词和路径名扩展的影响:尝试输入 hello word
或 *
,你会看到不好的事情发生。
要实现你想要的:Bash≥4 你可以使用 mapfile
如下:
mapfile -t arr
printf '%s\n' "${arr[@]}"
或者,对于旧版 Bash,您可以使用循环:
arr=()
while IFS= read -r l; do
arr+=( "$l" )
done
printf '%s\n' "${arr[@]}"
如果你想在输入时打印每一行,使用循环版本可能更容易:
arr=()
while IFS= read -r l; do
printf '%s\n' "$l"
arr+=( "$l" )
done
如果您喜欢冒险,可以像这样使用 mapfile
的回调:
cb() { printf '%s\n' "$2"; }
mapfile -t -c1 -C cb arr
关于arrays - 如何在 bash shell 脚本中将多行输入读取到数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41345039/
我是一名优秀的程序员,十分优秀!