Shell: 如何从多个参数创建一个列表变量

Shell: how to create a list variable from several args

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

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

我试图用 Args=[${@:3}] 替换 Args=[,,....] 但参数不是逗号分隔的。

您可以使用:

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

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

如果你想避免尾随逗号,那么使用一个变量来存储 printf 输出和 trim 结束 , 作为这个代码:

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

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

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

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

顺便说一下,

${} 是一个语法错误。