我想在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"'
答案 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"==