У меня есть текстовый файл с несколькими строками. Я использую команду while для построчного чтения файла, но мне нужно сохранить значения в отдельных переменных и использовать их в завершающем скрипте оболочки.
Theрезатькоманда разделяет весь файл, а не прочитанную строку.
Пример my_file.txt
:
d1:jobid1
id2:jobid2
Я использую следующий цикл while для построчного чтения файла
while IFS= read -r line; do
jobid=`cut -d: -f2`
id=`cut -d: -f1`
#remaining shell-script dependent upon variables#
done < my_file.txt
Я хочу сохранить jobid и id для каждой строки my_file.txt
и запустить завершающий скрипт.Каждая строка в новой строке.
Нужна помощь в сохранении значений в переменных рекурсивно. Если есть лучший способ читать построчно и разделять и хранить два поля отдельно.
решение1
cut
по умолчанию считывает из стандартного ввода. В вашей подстановке команд стандартный ввод наследуется от стандартного ввода цикла (поскольку вы не предоставляете никакого явного ввода для вызовов cut
). Стандартный ввод цикла поступает из вашего входного файла.
Эффект заключается в том, что первая строка вашего файла считывается read
, в то время как все остальные строки считываются самым первым вызовом cut
. Таким образом, значение в jobid
переменной будет строкой идентификаторов заданий, разделенных новой строкой, в то время как id
переменная будет пустой. Цикл выполнит только одну итерацию.
Тымог бы использовать, например,
id=$( printf '%s\n' "$line" | cut -d: -f1 )
# or: id=$( cut -d: -f1 <<<"$line" )
# (in shells that supports "here-strings")
но это было бы ненужно, так как это было бы чище и гораздо эффективнее сделать
while IFS=: read -r id jobid; do
# code that uses "$id" and "$jobid" goes here
done <my_file.txt
Здесь используется тот факт, что read
может считывать данные из строки ввода в несколько переменных одновременно. При установке IFS
двоеточия строка разделяется на двоеточии, и первое поле считывается в , id
а остальное считывается в . Вызывать вообще jobid
не нужно .cut