在字符串中扩展 bash 变量
Expanding bash variable within a string
我正在尝试获取要扩展的字符串中的变量 - 它是一个路径:
/path/to/${变量}/此处
- 字符串源自 json 文件。
- 随后由 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
.
的需要
我正在尝试获取要扩展的字符串中的变量 - 它是一个路径:
/path/to/${变量}/此处
- 字符串源自 json 文件。
- 随后由 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
.