Как читать разные строки файла в разные переменные?

Используйте xbindkeys , он создает глобальные сочетания клавиш.

DESCRIPTION
       XbindKeys  is a program that grab keys and mouse button events in X and
       starts associated shell command.
14
25.01.2017, 13:04
3 ответа

Я бы предложил использовать массив для такой задачи (задач)

mapfile -t -O 1 var <input.txt

, чтобы у вас была каждая строка в $ {var [1]} , $ {var [2] } и так далее

13
27.01.2020, 19:50

Это не совсем то, о чем вы просили, но это может сработать для ваших нужд. Вы можете сериализовать данные с помощью Awk. Обратите внимание, что это не работает, если ваш $ 1 не является допустимым именем переменной:

awk '
function quote(str,   d, m, x, y, z) {
  d = "\47"; m = split(str, x, d)
  for (y in x) z = z d x[y] (y < m ? d "\\" d : d)
  return z
}
{
  print $1 "=" quote($0)
}
' input.txt > /tmp/input.sh
. /tmp/input.sh

Результат:

$ echo "$line1"
line1 foo foobar bar
0
27.01.2020, 19:50

You ' d do:

unset -v line1 line2
{ IFS= read -r line1 && IFS= read -r line2; } < input.txt

Или:

{ line1=$(line) && line2=$(line); } < input.txt

(менее эффективно, так как строка редко бывает встроенной, и большинству оболочек требуется разветвление для реализации подстановки команд. строка также больше не является стандартная команда).

Чтобы использовать цикл:

unset -v line1 line2 line3
for var in line1 line2 line3; do
  IFS= read -r "$var" || break
done < input.txt

Или автоматически определять имена переменных как line <++ n> :

n=1; while IFS= read -r "line$n"; do
  n=$((n + 1))
done < input.txt

Обратите внимание, что bash поддерживает переменные массива и встроенная функция readarray для чтения строк в массив:

readarray -t line < input.txt

Однако обратите внимание, что, в отличие от большинства других оболочек, индексы массива bash начинаются с 0, а не с 1 (унаследовано от ksh ), поэтому первая строка будет в $ {line [0]} , а не в $ {line [1]} (хотя , как показал @Costas , вы можете заставить readarray (он же mapfile ) начать записывать значения с индексом 1 ( bash массивы также вопреки тому, что большинство других оболочек являются разреженные массивы) с -O 1 ).

См. Также: Что такое «IFS = read -r line»?

21
27.01.2020, 19:50

Теги

Похожие вопросы