我正在编写一个具有以下结构的 shell 脚本:
...
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。问题出在生成的 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
听起来您正在查询的任何服务器都被配置为返回 Windows 样式的行结尾 ( \r\n
) 而不是“正常” *nix 样式\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')