コマンド置換で文字列に奇数文字を追加する

コマンド置換で文字列に奇数文字を追加する

私は次の構造のシェルスクリプトを書いています。

    ...
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として評価され、2番目のコマンドで使用する必要があります。問題は生成された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')

関連情報