変数が変更されたときに文字列内のbashパラメータを評価する方法

変数が変更されたときに文字列内のbashパラメータを評価する方法

これをどのように説明するのかよくわかりませんが、私がしていることを説明しようとします。私はBASH文字列を渡す方法を見つけるために壁に頭を傾けていました。{command:$1}スクリプトに追加し、$1その値で埋めるようにします。

私が試したいのは、出力をjsonに変換し、スクリプトを使用して解析し、書式設定し、キーと値を設定して、目的の列を取得するlsofことです。awk

私のスクリプト

#!/bin/bash

FORMAT=$1
(
IFS=' ';
while read line; do
    set -- $line;
    echo $FORMAT
done
)

私のコマンドラインを呼び出す

lsof -Pn | grep LISTEN | awk '{print $1,$2,$3,$4,$5,$8,$9}' | ~/.scripts/json "{command:\$1,pid:\$2,user:\$3,fd:\$4,protocol:\$5:\$6,host:\$7}"

私の帰還

{command:$1,pid:$2,user:$3,fd:$4,protocol:$5:$6,host:$7}

スラッシュを削除すると

{command:,pid:,user:,fd:,protocol::,host:}

私が何を期待しているの?

{command:webstorm,pid:5270,user:daviddiefenderfer,fd:142u,protocol:IPv4:TCP,host:127.0.0.1:6942}

正確に何が起こっているのか分からないが、理解したい。変数は、$[1-7]値のないwhileループに入る前に評価されているようです。

ベストアンサー1

あなたは車輪を再発明しています(そして間違っています)。 JSONを生成するために使用されますjq

 lsof -Pn | 
   awk '/LISTEN/ {print $1,$2,$3,$4, $5,$8,$9}' |
   jq -R 'split(" ") |
         {
           command: .[0],
           pid: .[1],
           user: .[2],
           fd: .[3],
           protocol: "\(.[4]):\(.[5])", 
           host: .[6]
         }'

あなたのバージョンがjq正規表現をサポートしている場合は、次の呼び出しを削除することもできますawk

lsof -Pn | jq -R '
  select(match("LISTEN")) |
  [splits("  *")] |
  {
    command: .[0],
    pid: .[1],
    user: .[2],
    fd: .[3],
    protocol: "\(.[4]):\(.[7])", 
    host: .[8]
  }'

おすすめ記事