我正在尝试循环输出一个命令,该命令输出以 \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
#!/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 建议的作为输出过滤器的效果会更好。