エコーを使用しますが印刷しないでください(内容が多すぎます)。

エコーを使用しますが印刷しないでください(内容が多すぎます)。

編集する 予想される情報を印刷し、デバッグを妨げるコードスニペットがあります。その後、「エコーを使用して印刷を使用しない」方法があるかどうか、私のコードに何かがあるかどうか疑問に思います。以下は私の元の質問です。

元の質問

多くの人が「印刷されていません」を心配しており、すべてのクエリがスパムでいっぱいであるため、回答が得られないため、私のリクエストはおそらく奇妙になることを知っています。たとえば、{another_thing}を印刷せずに次のコードを自動的に実行したいとします。私はGNU bashバージョン4.3.48、Ubuntu 16.04 LTSを使用しています。

for sth in $(echo $another_thing |jq -r 'keys[]');do
    count=$(echo $another_thing |jq -r ".[\"${sth}\"].somekey |length")
    echo ${count}
done

私はただ見たいです:

1.

2.

三。

..変える。

長いロープ。

長いロープ。

1.

長いロープ。

長いロープ。

2.

...

another_thingの例:

{
    "test": {
        "domain": "abc.com",
        "regions": [{
            "geo": "\"CountryCode\":\"AA\"",
            "server": "1.2.33.4",
            "action": "proxy",
            "proxy": "as-test.abc.com"
        }, {
            "geo": "\"ContinentCode\":\"BB\"",
            "server": "1.2.3.4",
            "action": "proxy",
            "proxy": "test.abc.com"
        }]
    },
    "sample": {
        "domain": "bbb.com",
        "regions": [{
            "geo": "\"CountryCode\":\"AA\"",
            "server": "4.5.6.7",
            "action": "redirect",
            "redirect": "abc.com"
        }, {
            "geo": "\"ContinentCode\":\"BB\"",
            "server": "6.7.8.9",
            "action": "proxy",
            "proxy": "sample.bbb.com"
        }]
    }
}

私が望むのは、各要素の下の情報領域情報を取得し、別のタスクを実行することです。 "for"ループ内のコードのより詳細なバージョン

index=0
count=$(echo $another_thing |jq -r ".[\"${sth}\"].regions |length")
while [ $index -lt $count ]; do
    geo=$(echo $another_thing |jq -r ".[\"${sth}\"].regions[${index}].geo")
    geoid=$(echo ${geo} |sed 's|"||g' |awk -F: '{print $2}' |tr [:upper:] [:lower:])
    server=$(echo $another_thing |jq -r ".[\"${sth}\"].regions[${index}].server")
    some_function ${varible_1} ${varible_2} $server $geo $geoid
    index=$(expr $index + 1)
done

答え1

正直に言うと、あなたが話している出力をどこで取得するのかわかりません。ただし、使用しているシェルコードは複雑すぎて、繰り返しごとに4つの外部ユーティリティを呼び出しますsome_function。おそらくやっているだろう)。

以下は代替実装です(JSONデータがあるとしますfile.json)。

#!/bin/bash

jq -r '.[].regions[]|[.geo, .server]|@tsv' <file.json |
while IFS=$'\t' read geo server; do
    geoid=${geo#*:}
    geoid=${geoid//\"/}
    some_function "$variable1" "$variable2" "$server" "$geo" "$geoid"
done

与えられたデータに対して、jq呼び出しは次の出力を生成します。

"CountryCode":"AA"      1.2.33.4
"ContinentCode":"BB"    1.2.3.4
"CountryCode":"AA"      4.5.6.7
"ContinentCode":"BB"    6.7.8.9

これはタブ区切りのテキストであり、シェルループはそれをgeosumとして読み込みますserver

まず、前の内容を削除してから残りの値から二重引用符を削除すると、geoid簡単に解析できます。これは2つの変数置換を使用して行われます(2番目の変数はシェルと同じである必要があります)。$geo:bash

それから電話してくださいsome_function

some_function出力の問題をデバッグするには、問題が何であるかを教えてください。

関連情報