Bash字符串数组,空格字符作为可执行参数

时间:2012-03-16 08:28:51

标签: bash

有这段代码:

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 *中显示的那样,所以我可以随时添加一些东西。如何正确传递这些参数?

2 个答案:

答案 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

命令行参数由空格自动分隔,但如果你将它们转义,它们将作为字符串的一部分得到。