【发布时间】:2017-12-06 00:49:52
【问题描述】:
我有一个 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') 一样工作,我需要进行哪些更改?
(也许将命令的参数存储在数组中甚至是完全错误的?我愿意接受建议。)
【问题讨论】:
-
省略双引号有什么问题,就像您在第二个示例中所做的那样?
-
一般来说,引号是围绕数据,而不是in数据。在第一个示例中,使用直接提供的参数,双引号是 围绕 第二个参数的一部分,而不是实际参数本身的一部分。当您在数组元素中存储双引号时,它们是数据,而不是 shell 语法,因此它们确实作为参数本身的一部分传递。解决方案:就像你的第二个例子一样,把它们排除在外。