有这段代码:
test2.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 *中显示的那样,所以我可以随时添加一些东西。如何正确传递这些参数?
答案 0 :(得分:2)
在变量的值中嵌入引号(或转义)不会有用。在替换变量之前,引用会被解析为,所以当引号到达那里时,它们为时已晚做任何事情(有关更多示例,请参阅BashFAQ #050)。 BTW使用echo
打印命令极具误导性,使用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扩展,并不总是在普通shell中提供,所以你应该用bash
而不是sh
运行它。
答案 1 :(得分:0)
以这种方式调用它:
./test2 try\ 1 try\ 2
你会得到
0 ./test
1 try 1
2 try 2
命令行参数由空格自动分隔,但如果你将它们转义,它们将作为字符串的一部分得到。