Bash

bash 轉義引號

  • August 7, 2021

對於如何在 bash 腳本中轉義引號,我遇到了一個有趣的挑戰。

我的 bash 腳本有一個很長的 curl 呼叫,其中傳遞了一個大的 -d json 結構。

#!/bin/bash

Value4Variable=Value4

curl -s -X POST -H "Content-Type: application/json" -H "Accept: application/json" -d  \
'{"Variable1":"Value1", 
"Variable2":"Value2\'s",  # escape of quote doesnt work because of the previous single quote and backslash
"Variable3":"Value3",
"Variable4":"'"$Value4Variable"'", 
"Variable5":"Value5"
}' \
https://www.hashemian.com/tools/form-post-tester.php

在 json 結構中添加單引號的最佳方法是什麼?我嘗試了各種組合,但沒有成功。

有多種方法可以用不同的引號轉義長字元串。最簡單的就是結束單引號,轉義單引號:

'...'\''...'

但是你可以做一些更好的事情。Heredocs 是避免引用問題的好方法:

curl -s -X POST https://www.hashemian.com/tools/form-post-tester.php \
   -H "Content-Type: application/json" \
   -H "Accept: application/json" \
   -d  @- <<EOF
{
   "Variable1":"Value1", 
   "Variable2":"Value2's",
   "Variable3":"Value3",
   "Variable4":"$Value4Variable", 
   "Variable5":"Value5"
}
EOF

@-告訴 curl 從標準輸入讀取並<<EOF啟動將被輸入 curl 標準輸入的 heredoc。heredoc 的好處是您不需要轉義任何引號,並且可以在其中使用 bash 變數,無需擔心如何轉義引號並使整個內容更具可讀性。

引用自:https://unix.stackexchange.com/questions/414597