2016-03-24 7 views
0

Я работаю над скриптом, и неясно, как read -r line знает, какую переменную получить данные. Я хочу читать строки за строкой из переменной FILE.Чтение файла строки за строкой из переменной

Вот сценарий, я работаю над:

#!/bin/bash 
cd "/" 
FILE="$(< /home/FileSystemCorruptionTest/*.chk)" 

while read -r line 
do 
    echo "$line" > /home/FileSystemCorruptionTest/`date +%Y_%m_%d_%H_%M_%S`_1.log 
done 

echo "" > /home/FileSystemCorruptionTest/Done 
+0

Это пример игрушки? почему вы читаете файл в переменной? –

+0

Я читаю содержимое файла в переменной, потому что у меня будет много циклов, идущих друг за другом. – visc

+0

На самом деле это не объясняет, почему вы не просто 'cat' файл в файл журнала. Чего вы на самом деле хотите достичь? Использование цикла оболочки для обработки строки строки за строкой часто является тем, чего вы хотите избежать. – tripleee

ответ

2

Так это выглядит, как вы хотите, чтобы объединить несколько файлов, я думаю, что я бы рассматривать это как законное использование cat:

cat /home/FileSystemCorruptionTest/*.chk | while read -r line 
do 
    echo "$line" 
done > /home/FileSystemCorruptionTest/`date +%Y_%m_%d_%H_%M_%S`_1.log 

Обратите внимание, что я переместил перенаправление из цикла, чтобы предотвратить перезапись файла один раз в строке.

отметить также, что ваш пример может быть легко записать в виде:

cat /home/FileSystemCorruptionTest/*.chk > /home/FileSystemCorruptionTest/`date +%Y_%m_%d_%H_%M_%S`_1.log 

Если вы на самом деле только один файл (и хотите сохранить его в переменной), то вы можете использовать <<< после цикла:

while read -r line 
do 
    echo "$line" 
done <<<"$FILE" > /home/FileSystemCorruptionTest/`date +%Y_%m_%d_%H_%M_%S`_1.log 

<<< "$FILE" имеет тот же эффект, что и использование echo "$FILE" | перед циклом, но это не создает никаких подоболочки.

1

Что вы запрашиваете:

echo "${FILE}" | while read -r line … 

Но я думаю, что решение Тома лучше.

Смежные вопросы