【问题标题】:How to store command arguments which contain double quotes in an array?如何在数组中存储包含双引号的命令参数?
【发布时间】: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 语法,因此它们确实作为参数本身的一部分传递。解决方案:就像你的第二个例子一样,把它们排除在外。

标签: linux bash shell unix


【解决方案1】:

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

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

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

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

-option2="with space"'-option2=with space' 都计算为相同的字符串。它们是写同一件事的两种方式。

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

这是完全正确的做法。数组非常适合这个。使用扁平字符串是错误的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-25
    • 1970-01-01
    • 2011-05-17
    • 2018-01-01
    • 2023-03-19
    • 2020-05-24
    • 2018-03-19
    • 1970-01-01
    相关资源
    最近更新 更多