usa o eco mas não imprime (muito conteúdo) [fechado]

0

EDITAR Eu tenho um pedaço de código, que imprime informações esperadas e me impede de depurar. Então eu estava me perguntando se existe uma maneira de "usar o eco, mas não imprimir" ou havia algo no meu código. Abaixo estava minha pergunta original.

Pergunta original

Eu sei que meu pedido pode ser estranho, já que muitas pessoas estão preocupadas com a possibilidade de "não imprimir" e não consigo responder, já que toda a minha pesquisa é spammada por isso. Por exemplo, só quero que o código a seguir seja executado silenciosamente sem imprimir {another_thing}. Estou usando o GNU bash, versão 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

Eu só quero ver:

1.

2.

3.

.. ao invés de .

alguma longa string.

alguma longa string.

1.

alguma longa string.

alguma longa string.

2.

...

exemplo de 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"
        }]
    }
}

O que eu quero fazer é obter as informações da região de informação em cada elemento e depois fazer outras coisas. Uma versão mais detalhada do código dentro do loop '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
    
por tikael 09.10.2018 / 06:49

1 resposta

1

Eu honestamente não tenho certeza de onde você obtém a saída que você diz que está recebendo, mas o código shell que você está usando é excessivamente complexo, chamando quatro utilitários externos em cada iteração (exceto o que some_function pode estar fazendo).

Aqui está uma implementação alternativa (supondo que os dados JSON estejam em 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

Para os dados fornecidos, a chamada jq geraria a seguinte saída:

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

Este é um texto delimitado por tabulações que o loop do shell está lendo em geo e server .

O geoid é simplesmente excluído de $geo , primeiro excluindo o material antes do : e, em seguida, removendo quaisquer aspas duplas do valor restante. Isso é feito usando duas substituições de variáveis (das quais a segunda precisa de um shell como bash ).

O some_function é então chamado.

Para depurar seu problema de saída, informe-nos o que o some_function faz.

    
por 09.10.2018 / 08:24