2013-06-21 92 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 

它会抱怨你(“坏替代”),但会工作。