我有一个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')
同时发挥作用?
(也许在数组中存储命令的参数甚至是完全错误的?我可以提出建议。)
答案 0 :(得分:4)
摆脱单引号。完全按照命令行编写选项。
ARGUMENTS+=(-option1=withoutspace)
ARGUMENTS+=(-option2="with space")
请注意,这与您的第二个选项完全相同:
ARGUMENTS+=('-option1=withoutspace')
ARGUMENTS+=('-option2=with space')
-option2="with space"
和'-option2=with space'
都评估为相同的字符串。他们有两种写同样的方式。
(也许在数组中存储命令的参数甚至完全错误?我愿意接受建议。)
这是完全正确的事情。阵列非常适合这种情况。使用扁平线将是一个错误。