令人惊讶的是,我在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