在字符串中扩展 bash 变量

Expanding bash variable within a string

我正在尝试获取要扩展的字符串中的变量 - 它是一个路径:

/path/to/${变量}/此处

  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 时,我可以看到它被单引号包围)。

最终使用 peak 接受的解决方案以更好地利用 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.

的需要