編集する 予想される情報を印刷し、デバッグを妨げるコードスニペットがあります。その後、「エコーを使用して印刷を使用しない」方法があるかどうか、私のコードに何かがあるかどうか疑問に思います。以下は私の元の質問です。
元の質問
多くの人が「印刷されていません」を心配しており、すべてのクエリがスパムでいっぱいであるため、回答が得られないため、私のリクエストはおそらく奇妙になることを知っています。たとえば、{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
これはタブ区切りのテキストであり、シェルループはそれをgeo
sumとして読み込みますserver
。
まず、前の内容を削除してから残りの値から二重引用符を削除すると、geoid
簡単に解析できます。これは2つの変数置換を使用して行われます(2番目の変数はシェルと同じである必要があります)。$geo
:
bash
それから電話してくださいsome_function
。
some_function
出力の問題をデバッグするには、問題が何であるかを教えてください。