在命令替换中将奇数字符添加到字符串中

在命令替换中将奇数字符添加到字符串中

我正在编写一个具有以下结构的 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')

相关内容