令人驚訝的是,我在1小時搜索此內容後找不到答案。 我想一個數組傳遞給我的腳本是這樣的:如何將數組參數傳遞給Bash腳本
test.sh argument1 array argument2
我不想把這個在另一bash腳本類似以下內容:
array=(a b c)
for i in "${array[@]}"
do
test.sh argument1 $i argument2
done
令人驚訝的是,我在1小時搜索此內容後找不到答案。 我想一個數組傳遞給我的腳本是這樣的:如何將數組參數傳遞給Bash腳本
test.sh argument1 array argument2
我不想把這個在另一bash腳本類似以下內容:
array=(a b c)
for i in "${array[@]}"
do
test.sh argument1 $i argument2
done
猛砸數組不「一流的價值觀」 - 你不能將他們周圍像一個「東西」。
假設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
很棒的回答。我知道這不符合OP對'test.sh argument1數組參數2'的要求,但是如果調用變爲'test.sh argument1 argument2 array'(該數組是最後一個),那麼它的工作量就會減少。 – doubleDown
很好的答案。但從技術上講,並不是將數組傳遞給腳本。如果OP需要將2個數組變量傳遞給此腳本,例如'test.sh argument1 array1 array2',該怎麼辦? – anubhava
讓您的腳本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
如果這是你的命令:
test.sh argument1 ${array[*]} argument2
您可以閱讀陣列到像這樣的test.sh:
arg1=$1
arg2=${2[*]}
arg3=$3
它會抱怨你(「壞替代」),但會工作。
另請參閱http://stackoverflow.com/a/1063367/2235132 – devnull