Shell:如何从几个args创建一个列表变量

时间:2017-05-17 15:14:31

标签: linux bash shell amazon-web-services amazon-emr

我有运行带有3个或更多args的cli命令的shell脚本,我无法事先指定将传递给脚本的args数。

cmd=$(aws emr add-steps --cluster-id ${1} --steps Type=CUSTOM_JAR, Jar=s3://elasticmapreduce/libs/script-runner/script-runner.jar, Name="$2",Args=[$3,$4,....])

我尝试将Args=[$3,$4,....]替换为Args=[${@:3}],但参数不是以逗号分隔的。

2 个答案:

答案 0 :(得分:3)

更改命令替换中IFS的值,并使用$*代替$@

cmd=$(IFS=,;
      aws emr add-steps --cluster-id ${$1} \
         --steps Type=CUSTOM_JAR, \
         Jar=s3://elasticmapreduce/libs/script-runner/script-runner.jar, \
         Name="$2",Args=["${*:3}"])

IFS=,后面的分号是可选的,只要对aws的调用在下一行开始,而不是在分配后立即开始。

顺便说一句,

${$1}是语法错误。

答案 1 :(得分:1)

您可以使用:

Args=$(printf "%s," "${@:3}")

从第3个参数开始打印所有参数,以逗号结尾。 (会有一个尾随的逗号)

如果你想避免使用尾随逗号,那么使用变量存储printf输出并修剪结束,作为此代码:

printf -v args "%s," "${@:3}"
Args="${args%,}"