簡體   English   中英

在bash中擴展字符串變量以切換JSON中的值

[英]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函數中的雙引號內將字符串devUrltestUrl模板化,但這就是我遇到的問題。

更新:

我嘗試了這個:

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"; }

筆記:

  • 與別名不同,函數主體應為實際代碼,而不是包含代碼的字符串。
  • 存儲數據(與代碼相對)應使用變量(適當時是字符串或數組)來完成。
  • 從代碼中帶外傳遞數據允許devUrltestUrl的惡意值轉義其引用並運行任意jsonjq命令。 這是明智的,很大程度上是因為這些語言會隨着時間的推移變得越來越強大:舊版本的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM