如何在数组中存储包含双引号的命令参数?

时间:2017-12-06 00:49:52

标签: linux bash shell unix

我有一个Bash脚本,可以在数组中生成,存储和修改值。这些值稍后用作命令的参数。

对于MCVE,我想到了一个任意命令bash -c 'echo 0="$0" ; echo 1="$1"',它解释了我的问题。我将使用两个参数-option1=withoutspace-option2="with space"来调用我的命令。所以它看起来像这样

> bash -c 'echo 0="$0" ; echo 1="$1"' -option1=withoutspace -option2="with space"

如果对命令的调用将直接输入shell。它打印

0=-option1=withoutspace
1=-option2=with space

在我的Bash脚本中,参数是数组的一部分。然而

#!/bin/bash
ARGUMENTS=()
ARGUMENTS+=('-option1=withoutspace')
ARGUMENTS+=('-option2="with space"')
bash -c 'echo 0="$0" ; echo 1="$1"' "${ARGUMENTS[@]}"

打印

0=-option1=withoutspace
1=-option2="with space"

仍显示双引号(因为它们按字面解释?)。有效的是

#!/bin/bash
ARGUMENTS=()
ARGUMENTS+=('-option1=withoutspace')
ARGUMENTS+=('-option2=with space')
bash -c 'echo 0="$0" ; echo 1="$1"' "${ARGUMENTS[@]}"

再次打印

0=-option1=withoutspace
1=-option2=with space

我需要更改哪些内容才能使ARGUMENTS+=('-option2="with space"')ARGUMENTS+=('-option2=with space')同时发挥作用?

(也许在数组中存储命令的参数甚至是完全错误的?我可以提出建议。)

1 个答案:

答案 0 :(得分:4)

摆脱单引号。完全按照命令行编写选项。

ARGUMENTS+=(-option1=withoutspace)
ARGUMENTS+=(-option2="with space")

请注意,这与您的第二个选项完全相同:

ARGUMENTS+=('-option1=withoutspace')
ARGUMENTS+=('-option2=with space')

-option2="with space"'-option2=with space'都评估为相同的字符串。他们有两种写同样的方式。

  

(也许在数组中存储命令的参数甚至完全错误?我愿意接受建议。)

这是完全正确的事情。阵列非常适合这种情况。使用扁平线将是一个错误。