我使用以下代码在bash
中逐字逐字地读取文件hi
但是,上述代码不起作用,因为while read line; do
for word in $line; do
echo "word = '$word'"
done
done < My_File
只有一行。我该如何修改代码?
答案 0 :(得分:5)
这会将一行读入数组,拆分IFS中的字符(默认情况下为空格标签和换行符)。
read -r -a words <My_File || (( ${#words[@]} ))
for word in "${words[@]}"; do
echo "Read word: $word"
done
||
条件会阻止set -e
(shouldn't be using anyhow}导致脚本退出,如果没有终止换行符。
请注意,只有在常规空格和其他字符分隔您的单词时,此方法才有效。如果您想要标签,请将-d ' '
更改为-d $'\t'
。
while IFS='' read -r -d ' ' word; word=${word%$'\n'}; [[ $word ]]; do
echo "Read word: $word"
done <My_File
如果您的文件不是完全(仅限空格分隔符)格式, word=${word%$'\n'}
会删除可能存在的任何换行符。
答案 1 :(得分:1)
您可以像这样调整代码,以便考虑没有终止换行符的行:
(cat My_File; echo ) | while read line; do
for word in $line; do
echo "word = '$word'"
done
done
这将在输入结尾处添加换行符,无论My_File是否有换行符,都不会更改输出。
-Rich Alloway(RogueWave)