好的,我正在尝试在 Bash 中做一些棘手的事情。我正在编写一个前端方法,它将决定我是否正在执行如下操作:
aws ecs update-service ... lots of args
或者
aws ecs create-service ... lots of args
它根据服务是否先前创建来执行此操作。这部分并不难。棘手的是,我将在某些参数是可选的地方使用它。例如,并非所有服务都具有负载均衡器。其中一些可选参数可能包含空格。
所以我可以做这样的事情:
local arg_name="--foo"
local arg_value="some value"
aws ecs create-service ... $arg_name $arg_value
如果 $arg_value 不包含空格,那就太好了。但如果包含空格,那么它会作为多个参数传递,而不是单个参数,这是有问题的。所以我这样做:
aws ecs create-service ... $arg_name "$arg_value"
但实际上,这可以传递一个空参数。如果没有引号,它不会传递任何内容,但如果有引号,如果 arg_value 为空,它会传递一个空字符串。AWS CLI 不喜欢这样。
除了彻底检查我可能要做的所有事情并确保我的参数都不包含空格(其中一些是 JSON,所以可能包含空格)之外,我束手无策。
有想法吗?
答案1
借助 Kamil 的文章提示,我想我找到了答案。我已经尝试了一些数组方法。以下是我的测试:
L='{"foo": "bar"}'
args+=(--foo)
args+=("${L}")
e args: ${args[@]}
e 只是一个小 C 程序,它打印如下参数:
Arg #0 == e
Arg #1 == args:
Arg #2 == --foo
Arg #3 == {"foo":
Arg #4 == "bar"}
如您所见,到目前为止,此解决方案不起作用,因为它仍然是单词分割。
所以我这样做了:
e args: ${args[@]}
Arg #0 == e
Arg #1 == args:
Arg #2 == --foo
Arg #3 == {"foo": "bar"}
然后,为了进一步测试,我这样做了:
empty=()
e this is empty: "${empty[@]}"
Arg #0 == e
Arg #1 == this
Arg #2 == is
Arg #3 == empty:
因此...关键部分是这样的:
args+=("${L}")
e args: "${args[@]}"
请注意两处引号。