명령 대체에서 문자열에 홀수 문자 추가

명령 대체에서 문자열에 홀수 문자 추가

저는 다음 구조의 쉘 스크립트를 작성하고 있습니다.

    ...
server_addr="address"
run_user="user:password"
job_url=$(curl -X POST -u ${run_user} -s -i http://${server_addr}:8080/webportal/rest/v4/repository/users/BIRT/report_problem:jobs | grep Location | grep -o -E '[^ ]+$')
job_state=$(curl -X POST -u ${run_user} -H "Content-Type: application/json" -s -i ${job_url} | grep state |  grep -o -E '[^ ]+$')

첫 번째 변수는 job_urlURL로 평가된 다음 두 번째 명령에 사용되어야 합니다. 문제는 생성된 URL에 있습니다. 터미널에서 직접 실행하면 일반 링크가 나타납니다.

http://address:8080/webportal/rest/v4/jobs/e0356d1c-ce69-489d-8f3c-40ae240cae6d

...하지만 스크립트에서 사용하면 실패합니다. Bash 디버그 모드에서는 문제가 표시됩니다.

++ curl -X POST -u user:password -s -i http://address:8080/webportal/rest/v4/repository/users/BIRT/report_problem:jobs
++ grep -o -E '[^ ]+$'
++ grep Location
+ job_url=$'http://address:8080/webportal/rest/v4/jobs/e0356d1c-ce69-489d-8f3c-40ae240cae6d\r'

어떤 이유로 URL에 정규식 표기법이 있습니다. $'http://address:8080/webportal/rest/v4/jobs/e0356d1c-ce69-489d-8f3c-40ae240cae6d\r'이는 모든 추가 스크립트 기능을 중단시킵니다.

그 이유는 무엇입니까? cURL에서 참조 변경, awk와 grep 간 전환, bash 옵션 확인을 시도했습니다. 저는 bash-4.1.2-41.el6_8.x86_64RHEL 6을 실행 중입니다.

도움을 주시면 감사하겠습니다!

답변1

\r\n쿼리하는 서버가 "일반적인" *nix 스타일이 아닌 Windows 스타일 줄 끝( )을 반환하도록 구성된 것처럼 들립니다 \n. 불행하게도 와 달리 \n변수 \r에 할당될 때 명령 출력에서 ​​제거되지 않습니다. 표시하려면:

$ var=$(printf 'hello\n')
$ printf  '%s' "$var" | od -c
0000000   h   e   l   l   o
0000005
$ var=$(printf 'hello\r\n')
$ printf  '%s' "$var" | od -c
0000000   h   e   l   l   o  \r
0000006

보시다시피 \n자동으로 삭제되지만 \r자동으로 삭제되지는 않습니다. 따라서 서버 구성을 변경할 수 없는 경우 직접 삭제할 수 있습니다 \r.

job_url=$(curl ... | grep Location | grep -o -E '[^ ]+$' | tr -d '\r')

관련 정보