Я пытаюсь зациклить вывод команды, которая выплевывает строки, разделенные \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

Вывод программы на фортране имеет вид:

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?

2 ответа2

1

Обычный способ читать построчно с помощью цикла while-read.

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

Мне нравится этот способ лучше, используя массив bash. Это все еще изменяет IFS, хотя, но только для создания массива.

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

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

Однако если строк очень много, я полагаю, что предложение Игнасио работать в качестве фильтра на выходе будет работать намного лучше.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .