
Я хотел написать функцию для извлечения поля из списка фоновых заданий в bash. Например, для получения определенного аргумента.
Допустим, я перевожу vim в фоновый режим, и «jobs» отображает следующий список:
[1]+ Stopped vim ~/.bashrc
Моя функция выглядит так:
function jf {
echo `jobs | awk 'NR==$1{print $$2}'`;
}
Тогда я называю это так:
jf 1 4
Я хотел бы, чтобы он возвращал 4-й столбец 1-й строки, который будет "~/.bashrc", но он этого не делает. Что я делаю не так?
решение1
Вам нужно указать awk
, что вы хотите передать значения из переменных оболочки. Что-то вроде этого в определении функции должно сработать:
function jf {
echo `jobs | awk -v LINENO=$1 -v COLUMNNO=$2 'NR==LINENO {print $COLUMNNO}'`
}
решение2
Одинарные кавычки сделали bash не заменяющим аргументы. Как упомянул manatwork, двойные кавычки интерпретируются менее строго.
manatwork написал:
awk "NR==$1{print \$$2}"
Тем не менее, часть "echo `...`" в моей функции создавала проблему, но, похоже, я слишком все усложнил, и она вообще не нужна. Эта новая функция работает для меня:
function jf {
jobs | awk "NR==$1{print \$$2}";
}