Bash 不可见参数

Bash 不可见参数

好的,我正在尝试在 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[@]}"

请注意两处引号。

相关内容