2013-06-21 143 views
17

令人驚訝的是,我在1小時搜索此內容後找不到答案。 我想一個數組傳遞給我的腳本是這樣的:如何將數組參數傳遞給Bash腳本

test.sh argument1 array argument2 

我不想把這個在另一bash腳本類似以下內容:

array=(a b c) 
for i in "${array[@]}" 
do 
    test.sh argument1 $i argument2 
done 
+0

另請參閱http://stackoverflow.com/a/1063367/2235132 – devnull

回答

17

猛砸數組不「一流的價值觀」 - 你不能將他們周圍像一個「東西」。

假設test.sh是一個bash腳本,我會做

#!/bin/bash 
arg1=$1; shift 
array=("[email protected]") 
last_idx=$((${#array[@]} - 1)) 
arg2=${array[$last_idx]} 
unset array[$last_idx] 

echo "arg1=$arg1" 
echo "arg2=$arg2" 
echo "array contains:" 
printf "%s\n" "${array[@]}" 

並調用它像

test.sh argument1 "${array[@]}" argument2 
+0

很棒的回答。我知道這不符合OP對'test.sh argument1數組參數2'的要求,但是如果調用變爲'test.sh argument1 argument2 array'(該數組是最後一個),那麼它的工作量就會減少。 – doubleDown

+2

很好的答案。但從技術上講,並不是將數組傳遞給腳本。如果OP需要將2個數組變量傳遞給此腳本,例如'test.sh argument1 array1 array2',該怎麼辦? – anubhava

9

讓您的腳本arrArg.sh這樣的:

#!/bin/bash 

arg1="$1" 
arg2=("${!2}") 
arg3="$3" 
arg4=("${!4}") 

echo "arg1=$arg1" 
echo "arg2 array=${arg2[@]}" 
echo "arg2 #elem=${#arg2[@]}" 
echo "arg3=$arg3" 
echo "arg4 array=${arg4[@]}" 
echo "arg4 #elem=${#arg4[@]}" 

現在設置你的陣列,像這樣的一個shell:

arr=(ab 'x y' 123) 
arr2=(a1 'a a' bb cc 'it is one') 

而且傳遞參數是這樣的:

. ./arrArg.sh "foo" "arr[@]" "bar" "arr2[@]" 

上面的腳本會打印:

arg1=foo 
arg2 array=ab x y 123 
arg2 #elem=3 
arg3=bar 
arg4 array=a1 a a bb cc it is one 
arg4 #elem=5 

注:它可能會出現奇怪的,我使用. ./script語法執行腳本。請注意,這用於執行當前shell環境中的腳本命令

問:爲什麼當前的shell環境和爲什麼不是子shell?
A.因爲bash的不數組變量導出到子進程爲documented here by bash author himself

+5

如果任何數組元素包含空格,該怎麼辦? –

+1

這是窮人的方法。 – devnull

+0

@glennjackman:改變了我的方法,請現在檢查。 – anubhava

-3

如果這是你的命令:

test.sh argument1 ${array[*]} argument2 

您可以閱讀陣列到像這樣的test.sh:

arg1=$1 
arg2=${2[*]} 
arg3=$3 

它會抱怨你(「壞替代」),但會工作。