awk を使用して bash のジョブ リストのフィールドを取得するにはどうすればよいですか?

awk を使用して bash のジョブ リストのフィールドを取得するにはどうすればよいですか?

bash のバックグラウンド ジョブのリストからフィールドを取得する関数を書きたいと考えていました。たとえば、特定の引数を取得する場合などです。

vim をバックグラウンドに送信すると、「jobs」に次のリストが表示されます。

[1]+  Stopped                 vim ~/.bashrc

私の関数は次のようになります:

function jf {
    echo `jobs | awk 'NR==$1{print $$2}'`;
}

私は次のように呼び出します:

jf 1 4

1 行目の 4 列目 (「~/.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}";
}

関連情報