Я пытаюсь записать сценарий удара, чтобы считать файл, как введено и добавить значения/данные в том файле в переменные, и значения переменных должны быть обновлены каждое повторение на основе входной строки из файла.
Например: Входной файл похож ниже:
100 Thomas Manager Sales $5,000
200 Jason Developer Technology $5,500
300 Sanjay Sysadmin Technology $7,000
400 Nisha Manager Marketing $9,500
500 Randy DBA Technology $6,000
При чтении этого через мой сценарий оболочки я определю 5 переменных, позвольте нам a, b, c, d, e.
Первое повторение:
Значения переменных должны быть присвоены с первой строкой входного файла.
a=100
b=Thomas
c=Manager
d=Sales
e=$5000
Второе повторение:
Значения переменных должны быть присвоены со второй строкой входного файла.
a=200
b=Jason
c=Developer
d=Technology
e=$5500
И так далее...
Любой дает некоторый вход о том, как записать сценарий для чтения значений в этом формате.
Можно использовать read
встроенная команда с опцией -a
с циклом для чтения каждой строки файла как массив. Затем можно присвоить значение элементов массива к переменным, в которых Вы нуждаетесь (или можно использовать элементы массива непосредственно в сценарии):
#!/bin/bash
IN_FILE='./in-file.txt'
while read -ra LINE
do
a="${LINE[0]}"; b="${LINE[1]}"; c="${LINE[2]}"
d="${LINE[3]}"; e="${LINE[4]}"
echo -e "$a\n$b\n$c\n$d\n$e\n"
done < "$IN_FILE"
Иначе должен присвоить значения каждого столбца определенной строки непосредственно к переменным. Следующий пример использует функцию удара, которая подаст переменные с новыми значениями, когда это назовут. Функция имеет входной параметр того, который определяет который строка из файла быть проанализированным.
#!/bin/bash
IN_FILE='./in-file.txt'
args_feed() {
read -r a b c d e <<< "$(sed "$1 q;d" "$IN_FILE")"
}
# -----------------
# Examples of usage
# -----------------
# Parse the third line
args_feed 3
echo -e "$a\n$b\n$c\n$d\n$e\n"
# Sequential call - First iteration
args_feed $((++LINE_NR))
echo -e "$a\n$b\n$c\n$d\n$e\n"
# Sequential call - Second iteration
args_feed $((++LINE_NR))
echo -e "$a\n$b\n$c\n$d\n$e\n"
# Parse the entire file
NR_LINES="$(cat "$IN_FILE" | wc -l)"
for LINE_NR in $(seq 1 $NR_LINES)
do
args_feed "$LINE_NR"
echo -e "$a\n$b\n$c\n$d\n$e\n"
done
Примечания:
Значение по умолчанию $IFS
пробелы и вкладки, который применим в этом случае. Для получения дополнительной информации прочитайте этот энциклопедический ответ.
-r
опция используется в обоих примерах, переданных read
команда предотвращает побеги обратной косой черты из того, чтобы быть интерпретируемым.
Согласно использованию sed
, во втором примере прочитайте этот ответ.
Для большего количества примеров посмотрите версию предварительных просмотров ответа.