2012-03-16 25 views
1

有以下代码:与空格字符为可执行参数串的击阵列

测试2.cpp(编译为可执行TEST2):

#include <iostream> 

int main(int argc, char** argv) 
{ 
    for(int i = 0; i < argc; ++i){ 
     std::cout << i << " " << argv[i] << std::endl; 
    } 
    return 0; 
} 

test.sh(参数制备脚本):

some_array=("text1" "text two" "text tree") 

input_variables="" 

for i in $(seq 0 $((${#some_array[*]} - 1))); do 
    input_variables="$input_variables --parameter=\"${some_array[$i]}\"" 
    echo $input_variables 
done 

echo "Running: ./test2$input_variables" 
./test2 $input_variables 

输出:

$ sh test.sh 
--parameter="text1" 
--parameter="text1" --parameter="text two" 
--parameter="text1" --parameter="text two" --parameter="text tree" 
Running: ./test2 --parameter="text1" --parameter="text two" --parameter="text tree" 
0 ./test2 
1 --parameter="text1" 
2 --parameter="text 
3 two" 
4 --parameter="text 
5 tree" 

我想传递给test2可执行文件3个参数,但传递了5个参数,并且单词之间的空格字符存在问题。我也想保持输入参数在数组中,就像它在* some_array *中提供的那样,这样我就可以随时随地添加一些东西。如何正确传递这些参数?

回答

2

将引号(或转义符)嵌入到变量的值中并没有任何用处。在变量被替换之前,行情被解析为,因此在报价到达时,他们做任何事情都为时过晚(更多示例请参见BashFAQ #050)。而使用echo来打印命令的BTW非常具有误导性,请使用set -x让shell打印它认为正在发生的事情。

做的最好的事情,因为你在最后的报告中说,是把参数存储在磁盘阵列:

#!/bin/bash 
some_array=("text1" "text two" "text tree") 

input_variables=() 

for i in $(seq 0 $((${#some_array[*]} - 1))); do 
    input_variables+=("--parameter=${some_array[$i]}") 
    echo "${input_variables[@]}" 
done 

printf "Running:" 
printf " %q" ./test2 "${input_variables[@]}" 
./test2 "${input_variables[@]}" 

BTW,阵列是一个bash的扩展,而不是简单的炮弹总是可用的,所以你应该运行bash而不是sh

0

调用它以这样的方式

./test2 try\ 1 try\ 2 

你会得到

0 ./test 
1 try 1 
2 try 2 

命令行参数全自动用空格分隔,但如果你逃脱他们是获得尽可能字符串的一部分。