편집하다 예상 정보를 인쇄하고 디버깅을 방해하는 코드 조각이 있습니다. 그런 다음 "에코를 사용하지만 인쇄는 사용하지 않는" 방법이 있는지 아니면 내 코드에 뭔가가 있는지 궁금합니다. 아래는 내 원래 질문입니다.
원래 질문
많은 사람들이 "인쇄되지 않음"에 대해 걱정하고 있고 모든 검색어가 스팸으로 가득 차 있기 때문에 답변을 얻을 수 없기 때문에 내 요청이 아마도 이상할 것이라는 것을 알고 있습니다. 예를 들어, {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
간단히 구문 분석할 수 있습니다 . 이는 두 개의 변수 대체를 사용하여 수행됩니다(두 번째 변수는 셸과 동일해야 함).$geo
:
bash
그런 다음 전화하세요 some_function
.
some_function
출력 문제를 디버깅하려면 문제가 무엇인지 알려주십시오 .