我有运行带有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}]
,但参数不是以逗号分隔的。
答案 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%,}"