JSON 필드가 비어 있거나 비어 있지 않은 오류 메시지에 따라 오류를 감지하려고합니다. jq를 사용하여 멤버를 잘라내지만 "bash"에서 평가할 때 큰 어려움이 있습니다.bash JSON with jq - 빈 JSON 멤버를 확인하는 방법은 무엇입니까?
나는 (~ $를 내 CLI 프롬프트가 있습니다)를 errmsg를 멤버를 가지고 내 변수 $ 입력에 의해 참조되는 JSON 파일을 가지고 있지만 빈 문자열로 :
~$ echo $(jq "." $input)
{ "projectCode": "145", "fullCode": "1", "errMsg": "" }
가에 errmsg를 필드를 검색
~$ err=$(jq ".errMsg" $input)
~$ echo $err
""
문제 : 그 변수를 테스트하는 것은 불가능 보인다
~$ if [ $err = "" ]; then echo EMPTY; else echo CONTENT; fi
CONTENT
이 경우 제대로 빈 문자열을 산출
""라고 표시된 $ err로 비 었음을 예상했습니다. 다른 방법으로 확인 :
~$ if [ $err != "" ]; then echo EMPTY; else echo CONTENT; fi
EMPTY
echo $ err yield ""이더라도 $ err은 분명히 ""가 아닙니다. 어떻게 그럴 수 있습니까? 어떤 bash 기능이 여기에없는가요? 나는 그것이 발견 추측
~$ if [ "$err" != "" ]; then echo EMPTY; else echo CONTENT; fi
bash: syntax error near unexpected token `then'
:
~$ echo $(jq "." $input)
{ "projectCode": "145", "fullCode": "1", "errMsg": "not empty" }
~$ echo $err
"not empty"
~$ if [ $err != "" ]; then echo EMPTY; else echo CONTENT; fi
bash: syntax error near unexpected token `then'
가 좋아, 다음과 같이 마스킹 :
은 어쨌든합니다 ($ 입력 내용을 변경 한 후) 비어 있지 않은 JSON과 그 시도 할 수 있습니다 두 번째 토큰은 "not"다음에 나옵니다. 그것은 또한 비어에 errmsg 회원 작동
~$ val=$(sed "s/^\(\"\)\(.*\)\1\$/\2/g" <<<"$err" | sed -e 's/\s.*$//')
~$ if [ "$val" = "" ]; then echo "NO ERROR"; else echo "ERROR"; fi
NO ERROR
: 많은 연구 후 나는 작동하는 것 같다이 진정으로 읽을 솔루션을 찾을 수 있습니다. 제발, 간단하고 우아한 해결책이 있어야합니다.
'[$ err = ""]'는 안전하지 않은 배쉬 코드입니다. 'jq'와는 아무런 관련이 없습니다. 'err'이 비어 있으면 유효한 문법이 아닌'[= ""]'을 실행합니다. '[ "$ err"= ""]'이 필요합니다. –
'''if [ "$ err"! = ""]; echo EMPTY; else echo CONTENT; fi''' - 정말로, 정말로 *는 문법 오류가 아닙니다. ('! ='는 논리 오류가 있음을 의미합니다). https://ideone.com/CblHNK –
에서 제대로 실행되는지 확인하십시오. 다른 사람들이 복사하여 붙여 넣기하여 특정 버그를 재현 할 수있는 코드 형태로 [mcve]를 제공 할 수 있다면 (이상적으로 테스트 한 재생기 이데온 또는 다른 편견적인 제 3 자 샌드 박스에서 작업하기 위해), 나는 그것을보고 매우 흥미가있을 것입니다. –