使用非标准 EOL 分隔符循环遍历字符串

使用非标准 EOL 分隔符循环遍历字符串

我正在尝试循环输出一个命令,该命令输出以 \n 而不是 bash 内部字段分隔符分隔的行。我有一个解决方法,可以暂时将 IFS 更改为 \n:

timestamps=$(somefortranprogram someinputfile)
OIFS="${IFS}"
NIFS=$'\n'
IFS="${NIFS}"
for timestamp in $timestamps
do
    IFS="${OIFS}"
    <things to do in loop>
    IFS="${NIFS}"
done

fortran 程序的输出形式如下:

June 27, 1989 00 UTC (+ 00 Hrs)
June 27, 1989 03 UTC (+ 00 Hrs)
June 27, 1989 06 UTC (+ 00 Hrs)
June 27, 1989 09 UTC (+ 00 Hrs)
June 27, 1989 12 UTC (+ 00 Hrs)
June 27, 1989 15 UTC (+ 00 Hrs)
June 27, 1989 18 UTC (+ 00 Hrs)

...循环遍历每一行的时间戳会很好,但 bash 会循环遍历空格,从而遍历每个单词。有没有更好的方法可以做到这一点,而不需要临时更改 $IFS?

答案1

逐行读取的正常方式是使用 while-read 循环。

#!/bin/bash
while read -r line
do
  echo "$line"
done < <(somecommand)

答案2

我更喜欢这种方式,使用 bash 数组。它仍然会更改 IFS,但仅用于创建数组。

OIFS="${IFS}"
IFS=$'\n'
timestamps=($(somefortranprogram someinputfile))
IFS="${OIFS}"

for timestamp in "${timestamps[@]}"; do
    <things to do in loop>
done

然而,如果线条非常多,我相信 Ignacio 建议的作为输出过滤器的效果会更好。

相关内容