在 bash 中读取单行文件



我正在使用下面的代码在 bash 中逐字读取文件

while read line; do
    for word in $line; do
    echo "word = '$word'"
    done
done  < My_File

但是,上面的代码不起作用,因为My_File只有一行。我应该如何修改代码?

读入数组

这会将单行读取到数组中,在 IFS 中拆分字符(默认情况下为空格制表符和换行符(。

read -r -a words <My_File || (( ${#words[@]} ))
for word in "${words[@]}"; do
  echo "Read word: $word"
done

||条件可防止 set -e(无论如何都不应该使用(在没有终止换行符的情况下导致脚本退出。


使用空格分隔符读取

请注意,仅当常规空格(而不是其他字符(分隔您的单词时,此方法才有效。如果需要制表符,请将-d ' '更改为 -d $'t'

while IFS='' read -r -d ' ' word; word=${word%$'n'}; [[ $word ]]; do
  echo "Read word: $word"
done <My_File

word=${word%$'n'} 去除任何换行符,如果您的文件不是完全采用给定的(仅空格分隔符(格式,则可能存在这些换行符。

您可以像这样调整代码以考虑没有终止换行符的行:

(cat My_File; echo ) | while read line; do
    for word in $line; do
    echo "word = '$word'"
    done
done

这将在输入的末尾添加一个换行符,无论My_File是否有换行符,它都不会更改输出。

- Rich Alloway (RogueWave(

最新更新