从包含双引号的数组中扩展参数

时间:2017-07-26 11:29:31

标签: arrays bash quotes

我想在bash中使用参数从数组调用一个程序。

我想要bash来打电话:

echo -arg1=simple -arg2="some spaces"
来自array=(echo -arg1=simple "-arg2=\"some spaces\"")或类似的

(我可以调整项目的创建方式)。

问题

使用"${array[@]}" bash调用:

echo -arg1=simple '-arg2="some spaces"'

但我不想要单引号。如何正确构建和扩展数组?

示例代码

#!/bin/bash
set -x

array=()
array+=(echo)
array+=(-arg1=simple)
array+=("-arg2=\"some spaces\"")

"${array[@]}"
"${array[*]}"
${array[@]}
${array[*]}

结果通话

echo -arg1=simple '-arg2="some spaces"'
'echo -arg1=simple -arg2="some spaces"'
echo -arg1=simple '-arg2="some' 'spaces"'
echo -arg1=simple '-arg2="some' 'spaces"'

2 个答案:

答案 0 :(得分:3)

Match: chr1 43814981 COSM27287 G A 86.83350000000002 PASS chr1 43815008 COSM29008;COSM43212;COSM19193;COSM27289;COSM28487 TGG AAA,AAG,AGG,CGG,GCG 70.3099 PASS Missing in File1: chr1 43814979 COSM27286 G A 86.92679999999999 PASS Missing in File2: chr1 43814978 COSM27286 G A 86.92679999999999 PASS 是正确的。 "${array[@]}"选项只是选择一种规范的方式来显示需要引用的值,而-x相当于'-arg2="some spaces"'

答案 1 :(得分:1)

你可以这样做,不需要在数组中保留echo

#!/bin/bash -x

array=()
array+=(-arg1=simple)
array+=(-arg2="some spaces")

echo "${array[@]}"

调用echo会收到两个单词作为参数,-arg1=simple-arg2="some spaces",就好像你写了:

echo -arg1=simple -arg2="some spaces"

或者,您可以使用declare

在一行中定义数组
declare -a array=(-arg1=simple -arg2="some spaces")

要查看它的展开方式,您可以使用printf(我们在这里使用==只是为了清楚地显示每个参数的开头和结尾):

$ printf "==%s==\n" "${array[@]}"
==-arg1=simple==
==-arg2=some spaces==

请注意${array[@]}周围引号的重要性。它们确保数组中的每个元素只扩展为一个单词(就像在扩展前在shell中引用一样)。与之相比:

$ printf "==%s==\n" ${array[@]}
==-arg1=simple==
==-arg2=some==
==spaces==

<强>更新即可。如果你想将它扩展到-arg2="some spaces"(不知道为什么你会想要它),只需将它包装在定义的单引号内:

$ declare -a array=(-arg1=simple '-arg2="some spaces"')
$ echo "${array[@]}"
-arg1=simple -arg2="some spaces"
$ printf "==%s==\n" "${array[@]}"
==-arg1=simple==
==-arg2="some spaces"==