我有一个 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') 一样工作
?
(也许将命令的参数存储在数组中甚至是完全错误的?我愿意接受建议。)
最佳答案
去掉单引号。与在命令行上完全一样地编写选项。
ARGUMENTS+=(-option1=withoutspace)
ARGUMENTS+=(-option2="with space")
请注意,这与您的第二个选项完全相同:
ARGUMENTS+=('-option1=withoutspace')
ARGUMENTS+=('-option2=with space')
-option2="with space"
和 '-option2=with space'
均计算为同一字符串。它们是同一事物的两种写法。
(Maybe it's even entirely wrong to store arguments for a command in an array? I'm open for suggestions.)
这是正确的做法。数组非常适合于此。使用扁弦将是一个错误。
关于linux - 如何在数组中存储包含双引号的命令参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47665076/