在字符串中扩展bash变量

时间:2018-02-21 17:10:27

标签: json bash jq variable-expansion

我试图在字符串中获取一个变量来扩展 - 它是一条路径:

/路径/到/ $ {变量} /此处

  1. 该字符串源自json文件。
  2. 随后由jq读取 - 此时我需要进行扩展。
  3. 这是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。

1 个答案:

答案 0 :(得分:1)

正如评论中指出的那样,让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

的需要