에코를 사용하지만 인쇄하지 마세요(내용이 너무 많음).

에코를 사용하지만 인쇄하지 마세요(내용이 너무 많음).

편집하다 예상 정보를 인쇄하고 디버깅을 방해하는 코드 조각이 있습니다. 그런 다음 "에코를 사용하지만 인쇄는 사용하지 않는" 방법이 있는지 아니면 내 코드에 뭔가가 있는지 궁금합니다. 아래는 내 원래 질문입니다.

원래 질문

많은 사람들이 "인쇄되지 않음"에 대해 걱정하고 있고 모든 검색어가 스팸으로 가득 차 있기 때문에 답변을 얻을 수 없기 때문에 내 요청이 아마도 이상할 것이라는 것을 알고 있습니다. 예를 들어, {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간단히 구문 분석할 수 있습니다 . 이는 두 개의 변수 대체를 사용하여 수행됩니다(두 번째 변수는 셸과 동일해야 함).$geo:bash

그런 다음 전화하세요 some_function.

some_function출력 문제를 디버깅하려면 문제가 무엇인지 알려주십시오 .

관련 정보