使用 echo 但不打印(内容太多)

使用 echo 但不打印(内容太多)

编辑 我有一段代码,它打印出了预期的信息并阻碍了我的调试。然后我想知道是否有一种方法可以“使用回显但不打印”或者我的代码中有一些东西。以下是我原来的问题。

原问题

我知道我的请求可能很奇怪,因为很多人担心“不打印”,而我无法得到答案,因为我所有的搜索都被垃圾邮件淹没。例如,我只想安静地执行以下代码而不打印 {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 循环将其读入geoserver

通过首先删除 之前的内容,然后从剩余值中删除任何双引号,可以geoid简单地解析出来。这是通过使用两个变量替换来完成的(其中第二个变量需要像 一样的 shell )。$geo:bash

然后调用some_function

要调试您的输出问题,请告诉我们具体some_function是什么。

相关内容