
我正在嘗試使用curl 登入API。因為請求需要 JSON,所以我使用這個:
curl -s -X POST -H "Content-Type: application/json" \
$API_URL/auth -d@- <<EOF
{
"id": "[email protected]",
"password": "!password!"
}
EOF
……而且效果很好。我得到的結果看起來像這樣:
{"access_token":"jXed...I5mQ=","expires_in":3600}
但是當我嘗試捕獲變數中的輸出時,它不起作用。
我試過了:
x=$(curl ...)
……但是失敗了bash: !password!: event not found
是的,我的密碼做!
以;開頭這是 API 的測試安裝,因此我使用弱密碼。
我知道如果我使用set +H
或從腳本運行它,bash 不會對!
.我的問題是:
- 我偶爾想將腳本複製並貼上到命令行中。六個月後,我就會忘記這條皺紋。
- 為什麼 bash 甚至嘗試在定界文件中執行此操作?
由於上述的奇怪之處!
,我嘗試將結果透過管道傳輸到read
:
(curl ...
EOF
) | read x
……但隨後它以某種方式破壞了定界文檔,並且伺服器以相當於“無效 JSON”的方式進行響應。
順便說一句,如果我使用cat
而不是curl
,則定界文檔似乎是空的。
答案1
為了避免該錯誤,只需在腳本中event not found
使用, 即可。set +H
它是無害的,你可以添加評論來解釋它。
| read x
根本行不通;看http://tiswww.case.edu/php/chet/bash/FAQ, 具體來說:
E4) 如果我將命令的輸出透過管道傳輸到「讀取變數」中,為什麼當讀取命令完成時輸出不會顯示在 $variable 中?
在 bash 中,在子 shell 中| foo
運行。foo
它無法更改父 shell 中的變數。
代替使用x=$(whatever)
。