我试图在字符串中获取一个变量来扩展 - 它是一条路径:
/路径/到/ $ {变量} /此处
这是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。
答案 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
。