awkを使用してbashタスクリストのフィールドを取得するには?

awkを使用してbashタスクリストのフィールドを取得するには?

Bashのバックグラウンドタスクリストからフィールドを検索する関数を作成したいと思います。たとえば、特定のパラメータを取得します。

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

[1]+  Stopped                 vim ~/.bashrc

私の機能は次のとおりです

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

次に、次のように呼びます。

jf 1 4

最初の行の4番目の列「~/.bashrc」を返すことを期待していましたが、そうではありません。私は何が間違っていましたか?

答え1

awkシェル変数から値を渡したいことを示す必要があります。関数定義では、次のようなトリックを実行する必要があります。

function jf {
    echo `jobs | awk -v LINENO=$1 -v COLUMNNO=$2 'NR==LINENO {print $COLUMNNO}'`
}

答え2

一重引用符は、bashがパラメータを置き換えることを防ぎます。前述のように、二重引用符は厳密に解釈されません。

Manat Walkerは次のように書いています。

awk "NR==$1{print \$$2}"

それでも私の機能の「echo `...`」部分は問題を引き起こしていますが、あまりにも複雑で、まったく必要ないようです。この新機能は私にとって効果的です。

function jf {
    jobs | awk "NR==$1{print \$$2}";
}

関連情報