
나는 bash의 백그라운드 작업 목록에서 필드를 검색하는 함수를 작성하고 싶었습니다. 예를 들어 특정 인수를 얻으려면.
vim을 백그라운드로 보내서 "jobs"가 다음 목록을 표시한다고 가정해 보겠습니다.
[1]+ Stopped vim ~/.bashrc
내 기능은 다음과 같습니다
function jf {
echo `jobs | awk 'NR==$1{print $$2}'`;
}
그런 다음 다음과 같이 부릅니다.
jf 1 4
첫 번째 줄의 네 번째 열인 "~/.bashrc"를 반환하고 싶지만 그렇지 않습니다. 내가 도대체 뭘 잘못하고있는 겁니까?
답변1
awk
쉘 변수의 값을 전달하고 싶다고 알려야 합니다 . 함수 정의에서 다음과 같은 것이 트릭을 수행해야 합니다.
function jf {
echo `jobs | awk -v LINENO=$1 -v COLUMNNO=$2 'NR==LINENO {print $COLUMNNO}'`
}
답변2
작은따옴표로 인해 bash는 인수를 대체하지 않습니다. 언급한 것처럼 큰따옴표는 덜 엄격하게 해석됩니다.
manatwork님이 작성하셨습니다:
awk "NR==$1{print \$$2}"
그래도 내 함수의 "echo `...`" 부분이 문제를 일으켰지만 너무 복잡하게 만든 것 같아서 전혀 필요하지 않습니다. 이 새로운 기능은 저에게 효과적입니다.
function jf {
jobs | awk "NR==$1{print \$$2}";
}