2012-03-16 43 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 

命令行參數全自動用空格分隔,但如果你逃脫他們是獲得儘可能字符串的一部分。