如何在 bash 中正确打印读取的行
How to correctly print read lines in bash
我在尝试遍历纯文本文件时出现奇怪的行为:
#!/bin/bash
sed -n "5,5p" test.tmp
while read linea in
do
echo $linea
done < test.tmp
问题是,从第一个 sed 开始,我得到了我期望的结果,但是从 while 循环中,我没有:
./test.sh
(5) Sorgo DICOTILEDONEAS 1,5-2 l/ha 15
(1)
(2)
(3)
(4)
(5)
(6)
我附上这两个文件是为了帮助澄清这里发生的事情:
- 脚本:https://www.dropbox.com/s/w3sx8zbglvyti7w/test.sh?dl=0
- 输入数据:https://www.dropbox.com/s/p5jq8dl162jpofv/test.tmp?dl=0
提前致谢
我会做什么:
#!/bin/bash
while IFS= read -r linea; do
printf '%s\n' "$linea"
done < <(sed -n "5,5p" test.tmp)
< <( )
是进程替换,检查
http://mywiki.wooledge.org/ProcessSubstitution
http://wiki.bash-hackers.org/syntax/expansion/proc_subst
"Double quote" 每个包含 spaces/metacharacters 和 每个 扩展的文字:"$var"
、"$(command "$var")"
、"${array[@]}"
, "a & b"
。使用 'single quotes'
作为代码或文字 $'s: 'Costs US'
、ssh host 'echo "$HOSTNAME"'
。参见
http://mywiki.wooledge.org/Quotes
http://mywiki.wooledge.org/Arguments
http://wiki.bash-hackers.org/syntax/words
我终于知道是怎么回事了。 while 语句中有一个额外的 "in" 。可能我混合了两种不同的时间。
我的位置:
在读linea时
做
回声$linea
完成 < test.tmp
它应该是:
同时阅读linea; ## 在删除和 ;已添加
做
回声$linea
完成 < test.tmp
再次感谢
我在尝试遍历纯文本文件时出现奇怪的行为:
#!/bin/bash
sed -n "5,5p" test.tmp
while read linea in
do
echo $linea
done < test.tmp
问题是,从第一个 sed 开始,我得到了我期望的结果,但是从 while 循环中,我没有:
./test.sh
(5) Sorgo DICOTILEDONEAS 1,5-2 l/ha 15
(1)
(2)
(3)
(4)
(5)
(6)
我附上这两个文件是为了帮助澄清这里发生的事情:
- 脚本:https://www.dropbox.com/s/w3sx8zbglvyti7w/test.sh?dl=0
- 输入数据:https://www.dropbox.com/s/p5jq8dl162jpofv/test.tmp?dl=0
提前致谢
我会做什么:
#!/bin/bash
while IFS= read -r linea; do
printf '%s\n' "$linea"
done < <(sed -n "5,5p" test.tmp)
< <( )
是进程替换,检查
http://mywiki.wooledge.org/ProcessSubstitution
http://wiki.bash-hackers.org/syntax/expansion/proc_subst
"Double quote" 每个包含 spaces/metacharacters 和 每个 扩展的文字:"$var"
、"$(command "$var")"
、"${array[@]}"
, "a & b"
。使用 'single quotes'
作为代码或文字 $'s: 'Costs US'
、ssh host 'echo "$HOSTNAME"'
。参见
http://mywiki.wooledge.org/Quotes
http://mywiki.wooledge.org/Arguments
http://wiki.bash-hackers.org/syntax/words
我终于知道是怎么回事了。 while 语句中有一个额外的 "in" 。可能我混合了两种不同的时间。
我的位置:
在读linea时 做 回声$linea 完成 < test.tmp
它应该是:
同时阅读linea; ## 在删除和 ;已添加 做 回声$linea 完成 < test.tmp
再次感谢