簡體   English   中英

在字符串中擴展bash變量

[英]Expanding bash variable within a string

我試圖在字符串中獲取一個變量來擴展 - 它是一個路徑:

/path/to/${variable}/這里

  1. 該字符串源自 json 文件。
  2. 它隨后由 jq 讀取-此時我需要進行擴展。

這是json文件:

{
    "server_1":{
      "tag": "storage_1",
      "user": "me",
      "sshKey": "/Users/me/.ssh/id_rsa",
      "target_folder": "/Users/me/Desktop/",
      "pubIp": "127.0.0.1",
      "data_folders": [
        "/Users/me/Desktop/POD_INSTALLS/pod_DB/${BUILD_FOLDER}/data/table1/",
        "/Users/me/Desktop/POD_INSTALLS/pod_DB/${BUILD_FOLDER}/data/table2/"
      ]
    }
}

這是 jq 代碼(現在有工作代碼 - 謝謝大家):

  writeFolder=$(jq -r --arg bf "${BUILD_FOLDER}" '.server_'${id}'.data_folders[] | sub("\\${BUILD_FOLDER}";$bf)' "${json_path}")
  for folder in $writeFolder
  do
    ssh -q -o ForwardX11=no -i ${sshKey} ${user}@${pubIp} "mkdir -p ${folder}"
  done

最初 - 在擴展的 $writeFolder 變量中,可以看到路徑,但 ${BUILD_FOLDER} 變量保持未擴展,因為它是按字面意思理解的。 (當我使用 set -x 時,我可以看到它被單引號包圍)。

最終使用了來自峰值的公認解決方案,以更好地利用 jq。

正如評論中指出的那樣,讓 jq 做盡可能多的工作會更好。 但是要使用 jq,您需要修復 JSON。 另外,我不清楚您是否需要計算 $numberOfDataFolders,所以為了簡單起見,我建議這樣做:

#!/bin/bash

json_path=input.json

BUILD_FOLDER=mybuildfolder

jq -r --arg bf "$BUILD_FOLDER" '.data_folders[] | sub("\\${BUILD_FOLDER}";$bf)' "${json_path}" |
  while read -r writeFolder
    do
    echo mkdir -p "${writeFolder}"
  done 

一旦輸入被修復,這將產生:

mkdir -p /Users/me/Desktop/POD_INSTALLS/pod_DB/mybuildfolder/data/table1/
mkdir -p /Users/me/Desktop/POD_INSTALLS/pod_DB/mybuildfolder/data/table2/

另請注意, -r 選項避免了使用tr的需要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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