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}";
}