私は次の構造のシェルスクリプトを書いています。
...
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として評価され、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_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')