如何在Bash中创建JSON数组
我想为emr步骤创建JSON数组。我已经为单个json字符串创建了数组。这是我的bash代码-如何在Bash中创建JSON数组,bash,jq,amazon-emr,ash,Bash,Jq,Amazon Emr,Ash,我想为emr步骤创建JSON数组。我已经为单个json字符串创建了数组。这是我的bash代码- export source="s3a://sourcebucket" export destination="s3a://destinationbucket" EMR_DISTCP_STEPS=$( jq -n \ --arg source "$source" \ --arg destination "$destination"
export source="s3a://sourcebucket"
export destination="s3a://destinationbucket"
EMR_DISTCP_STEPS=$( jq -n \
--arg source "$source" \
--arg destination "$destination" \
'{
"Name":"S3DistCp step",
"HadoopJarStep": {
"Args":["s3-dist-cp","--s3Endpoint=s3.amazonaws.com", "'"--src=${sourcepath}"'" ,"'"--dest=${destinationpath}"'"],
"Jar":"command-runner.jar"
},
"ActionOnFailure":"CONTINUE"
}' )
输出
echo $EMR_DISTCP_STEPS
[{ "Name": "S3DistCp step", "HadoopJarStep": { "Args": [ "s3-dist-cp", "--s3Endpoint=s3.amazonaws.com", "--src=s3a://sourcebucket", "--dest=s3a://destinationbucket" ], "Jar": "command-runner.jar" }, "ActionOnFailure": "CONTINUE" }]
现在我想创建具有多个源和目标的JSON数组
输出
如何在Bash中生成包含多个源和目标JSON字符串的JSON数组?一种方法是提供一个jq函数,根据您想要修改的特定输入生成重复结构。考虑以下事项: 不管你想怎样生成它——硬编码,由循环构建,等等。 源端对= sourcebucket1:destinationbucket1 sourcebucket2:destinationbucket2 sourcebucket3:destinationbucket3 -R接受纯文本而不是JSON作为输入-n不会自动读取任何输入 …但允许在jq代码中稍后使用输入或输入。 jq-Rn' def指令对$source$目的地:{ 名称:S3DistCp步骤, Hadoop步骤:{ Args:[ 中三区总督察, -s3Endpoint=s3.amazonaws.com, -src=\$source, -dest=\$dest ], Jar:command-runner.Jar } }; [投入 |捕获^?[^:::+:?*$; |选择。 |说明ForPair.source;.dest]
’<一种方法是提供一个jq函数,根据您想要修改的特定输入生成重复结构。考虑以下事项: 不管你想怎样生成它——硬编码,由循环构建,等等。 源端对= sourcebucket1:destinationbucket1 sourcebucket2:destinationbucket2 sourcebucket3:destinationbucket3 -R接受纯文本而不是JSON作为输入-n不会自动读取任何输入 …但允许在jq代码中稍后使用输入或输入。 jq-Rn' def指令对$source$目的地:{ 名称:S3DistCp步骤, Hadoop步骤:{ Args:[ 中三区总督察, -s3Endpoint=s3.amazonaws.com, -src=\$source, -dest=\$dest ], Jar:command-runner.Jar } }; [投入 |捕获^?[^:::+:?*$; |选择。 |说明ForPair.source;.dest]
“<这三个项目应该有什么不同吗?如果是这样,那么用来区分它们的数据应该来自哪里?顺便说一句,请注意不要将语法引号与文字引号混为一谈。也就是说,在包含一个参数“fo”的shell命令中,“引用”是对shell的指令,而不是FoE参数的一部分,并且希望将其从任何JSON或其他更高级别的数据表示中排除。考虑将BASH脚本转换为Python,您将避免沿途有这么多陷阱。…我完全同意,能够表示您试图在内存中操作的结构的语言,以及符合相关格式规范的解析/生成工具,是处理结构化数据的正确工具。也就是说,jq就是这样一种语言,就像Python一样,而且在问题中也碰巧已经被标记了@lucy,…顺便说一句,关于变量名的说明-POSIX指定所有大写名称都保留给修改POSIX定义的实用程序和/或外壳本身行为的变量,而小写名称保留给应用程序使用,并保证不会修改兼容工具的行为。由于未导出的shell变量会修改同名的任何先前存在的环境变量,因此本指南适用于这两种类型;看,第四段。这三个项目应该有什么不同吗?如果是这样,那么用来区分它们的数据应该来自哪里?顺便说一句,请注意不要将语法引号与文字引号混为一谈。也就是说,在包含一个参数“fo”的shell命令中,“引用”是对shell的指令,而不是FoE参数的一部分,并且希望将其从任何JSON或其他更高级别的数据表示中排除。考虑将BASH脚本转换为Python,您将避免沿途有这么多陷阱。…我完全同意,能够表示您试图在内存中操作的结构的语言,以及符合相关格式规范的解析/生成工具,是处理结构化数据的正确工具。也就是说,jq就是这样一种语言,就像Python一样,而且在问题中也碰巧已经被标记了@lucy,…顺便说一句,关于变量名的说明-POSIX指定所有大写名称都保留给修改POSIX定义的实用程序和/或外壳本身行为的变量,而小写名称保留给应用程序使用,并保证不会修改兼容工具的行为。由于未导出的shell变量会修改同名的任何先前存在的环境变量,因此本指南适用于这两种类型;见,第4段。
[{ "Name": "S3DistCp step", "HadoopJarStep": { "Args": [ "s3-dist-cp", "--s3Endpoint=s3.amazonaws.com", "--src=s3a://sourcebucket1", "--dest=s3a://destinationbucket1" ], "Jar": "command-runner.jar" }, "ActionOnFailure": "CONTINUE" },
{ "Name": "S3DistCp step", "HadoopJarStep": { "Args": [ "s3-dist-cp", "--s3Endpoint=s3.amazonaws.com", "--src=s3a://sourcebucket2", "--dest=s3a://destinationbucket2" ], "Jar": "command-runner.jar" }, "ActionOnFailure": "CONTINUE" },
{ "Name": "S3DistCp step", "HadoopJarStep": { "Args": [ "s3-dist-cp", "--s3Endpoint=s3.amazonaws.com", "--src=s3a://sourcebucket3", "--dest=s3a://destinationbucket3" ], "Jar": "command-runner.jar" }, "ActionOnFailure": "CONTINUE" }]
[
{
"Name": "S3DistCp step",
"HadoopJarStep": {
"Args": [
"s3-dist-cp",
"--s3Endpoint=s3.amazonaws.com",
"--src=sourcebucket1",
"--dest=destinationbucket1"
],
"Jar": "command-runner.jar"
}
},
{
"Name": "S3DistCp step",
"HadoopJarStep": {
"Args": [
"s3-dist-cp",
"--s3Endpoint=s3.amazonaws.com",
"--src=sourcebucket2",
"--dest=destinationbucket2"
],
"Jar": "command-runner.jar"
}
},
{
"Name": "S3DistCp step",
"HadoopJarStep": {
"Args": [
"s3-dist-cp",
"--s3Endpoint=s3.amazonaws.com",
"--src=sourcebucket3",
"--dest=destinationbucket3"
],
"Jar": "command-runner.jar"
}
}
]