编辑 我有一段代码,它打印出了预期的信息并阻碍了我的调试。然后我想知道是否有一种方法可以“使用回显但不打印”或者我的代码中有一些东西。以下是我原来的问题。
原问题
我知道我的请求可能很奇怪,因为很多人担心“不打印”,而我无法得到答案,因为我所有的搜索都被垃圾邮件淹没。例如,我只想安静地执行以下代码而不打印 {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.
3.
.. 代替 。
一些长绳子。
一些长绳子。
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
老实说,我不太确定您从哪里获得您所说的输出,但是您使用的 shell 代码过于复杂,在每次迭代中调用四个外部实用程序(除了可能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
这是一个制表符分隔的文本,然后 shell 循环将其读入geo
和server
。
通过首先删除 之前的内容,然后从剩余值中删除任何双引号,可以geoid
简单地解析出来。这是通过使用两个变量替换来完成的(其中第二个变量需要像 一样的 shell )。$geo
:
bash
然后调用some_function
。
要调试您的输出问题,请告诉我们具体some_function
是什么。