![명령 대체에서 문자열에 홀수 문자 추가](https://linux55.com/image/113020/%EB%AA%85%EB%A0%B9%20%EB%8C%80%EC%B2%B4%EC%97%90%EC%84%9C%20%EB%AC%B8%EC%9E%90%EC%97%B4%EC%97%90%20%ED%99%80%EC%88%98%20%EB%AC%B8%EC%9E%90%20%EC%B6%94%EA%B0%80.png)
저는 다음 구조의 쉘 스크립트를 작성하고 있습니다.
...
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_url
URL로 평가된 다음 두 번째 명령에 사용되어야 합니다. 문제는 생성된 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_64
RHEL 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')