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

Linux 如何在数组中存储包含双引号的命令参数?,linux,bash,shell,unix,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" 如果

我有一个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
要使
参数+=('-option2=“带空格“)
参数+=('-option2=带空格“)
一起工作,我必须做哪些更改


(也许在数组中存储命令的参数是完全错误的?我愿意听取建议。)

去掉单引号。完全按照您在命令行上的方式编写选项

ARGUMENTS+=(-option1=withoutspace)
ARGUMENTS+=(-option2="with space")
请注意,这与您的第二个选项完全相同:

ARGUMENTS+=('-option1=withoutspace')
ARGUMENTS+=('-option2=with space')
-option2=“with space”
'-option2=with space'
都计算为相同的字符串。它们是写同一件事的两种方式

(也许在数组中存储命令的参数是完全错误的?我愿意听取建议。)


这是完全正确的做法。阵列非常适合这种情况。使用扁平字符串是错误的。

像在第二个示例中那样省略双引号有什么错?通常,引号围绕数据,而不是在数据中。在第一个示例中,对于直接提供的参数,双引号围绕着第二个参数的一部分,而不是参数本身的一部分。当您在数组元素中存储双引号时,它们是数据,而不是shell语法,因此它们确实作为参数本身的一部分传递。解决方案:就像你的第二个例子一样,只需将它们排除在外。