[英]Expanding string variables in bash to toggle a value in JSON
我正在嘗試創建一個bash函數,可以在其中切換環境,以下是我嘗試過的功能。 我在全局安裝了npm json
包以內聯編輯相關文件,但這可能不是必需的。
devUrl () { 'https://some-url.com'; }
testUrl () { 'https://some-test-url.com'; }
switchEnv () { 'json -I -f config.json -e "this.url = (this.url == "$1" ? "$2" : "$1")"'; }
alias switch='switchEnv devUrl testUrl';
我想念/做錯了什么?
我還嘗試在switchEnv
函數中的雙引號內將字符串devUrl
和testUrl
模板化,但這就是我遇到的問題。
更新:
我嘗試了這個:
devUrl='https://some-url.com'
testUrl='https://some-test-url.com'
switchEnv() { json -I -f config.json -e "this.url = (this.url == "$devUrl" ? "$testUrl" : "$devUrl")"; }
但出現以下錯誤:
this.url = (this.url == https://some-url.com ? https://some-test-url.com : https://some-url.com)
^
SyntaxError: Unexpected token :
at new Function (<anonymous>)
at main (/usr/local/lib/node_modules/json/lib/json.js:1289:27)
由於某種原因,它不喜歡https之后的:
。
以下是實現所需功能的示例實現; 有關為何按原樣實施的詳細信息,請參見下面的注釋。
# String assignments
devUrl='https://some-url.com'
testUrl='https://some-test-url.com'
configFile="$PWD/config.json"
# Functions
switchEnv() {
local tempfile
tempfile=$(mktemp "$configFile.XXXXXX")
if jq --arg a "$1" \
--arg b "$2" \
'if .url == $a then .url=$b else .url=$a end' <"$configFile" >"$tempfile"; then
mv -- "$tempfile" "$configFile"
else
rm -f -- "$tempfile"
return 1
fi
}
switch() { switchEnv "$devUrl" "$testUrl"; }
筆記:
devUrl
或testUrl
的惡意值轉義其引用並運行任意json
或jq
命令。 這是明智的,很大程度上是因為這些語言會隨着時間的推移變得越來越強大:舊版本的jq
沒有不會以恆定時間運行的操作,而現代版本的語言允許表達可用於以下目的的代碼拒絕服務攻擊; 未來的版本可能還會添加I / O支持,從而使惡意代碼具有更廣泛的令人驚訝的行為。 現在,假設您將忽略關於分離數據和代碼的重要性的警告(上述)。 當正在處理的字符串是非惡意的時,我們將如何修改當前代碼以使其行為“正確”?
switchEnv() {
json -I -f config.json -e 'this.url = (this.url == "'"$devUrl"'" ? "'"$testUrl"'" : "'"$devUrl"'")'; }
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.