Я хотел бы прочитать разные строки текстового файла для разных переменных. Например
input.txt
:
line1 foo foobar bar
line2 bar
line3 foo
line4 foobar bar
Я хочу , чтобы этот результат будет храниться в переменных var1
, var2
, var3
и var4
такие , что
var1=line1 foo foobar bar
var2=line2 bar
и так далее.
Может кто-нибудь, пожалуйста, скажите мне, как это делается. Я пытался использовать eval
в цикле. Это не похоже на работу.
grep
,cut
, и др. И др.), гораздо лучше просто делать то, что нужно. Не занимайтесь микроуправлением в сценарии оболочки; оркестровать инструменты, чтобы сделать работу.Ответы:
Вы бы сделали:
Или:
(менее эффективен, так как
line
редко встроен, и большинству оболочек требуется форк для реализации подстановки команд.line
Также больше не является стандартной командой).Чтобы использовать цикл:
Или для автоматического определения имен переменных как
line<++n>
:Обратите внимание, что
bash
поддерживаются переменные массива иreadarray
встроенная функция для чтения строк в массив:Однако обратите внимание, что в отличие от большинства других оболочек,
bash
индексы массива начинаются с 0, а не с 1 (унаследовано отksh
), поэтому первая строка будет${line[0]}
, а не${line[1]}
(хотя как показала @Costas , вы можетеreadarray
(иначеmapfile
) начать записывать значения с индекса 1 (bash
массивы также противоречат большинству других оболочек, являющихся разреженными массивами) с-O 1
).Смотрите также: Понять "IFS = read -r line"?
источник
Я бы предложил использовать массив для таких задач
так что вы будете иметь каждую строку
${var[1]}
,${var[2]}
и так далееисточник
Это не совсем то, что вы просили, но это может работать для ваших нужд. Вы можете сериализовать данные с помощью Awk. Обратите внимание, что это сломается, если ваш $ 1 не является допустимым именем переменной:
Результат:
источник