如何将数组参数传递给Bash脚本

时间:2013-06-21 10:03:21

标签: arrays bash arguments

令我惊讶的是,1小时后我找不到答案。 我想像这样将一个数组传递给我的脚本:

test.sh argument1 array argument2

我不想把它放在另一个bash脚本中,如下所示:

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

4 个答案:

答案 0 :(得分:25)

Bash数组不是“第一类值” - 你不能像一个“东西”那样传递它们。

假设test.sh是一个bash脚本,我会这样做

#!/bin/bash
arg1=$1; shift
array=( "$@" )
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

答案 1 :(得分:13)

让你的脚本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

答案 2 :(得分:0)

您可以将数组写入文件,然后在脚本中获取文件。 e.g:

array.sh

array=(a b c)

test.sh

source $2
...

运行test.sh脚本:

./test.sh argument1 array.sh argument3

答案 3 :(得分:-2)

如果这是你的命令:

    FATAL EXCEPTION: main
 Process: com.hos.android, PID: 9001
   java.lang.ClassCastException: android.os.BinderProxy cannot be cast to com.example.service.main.MainService$MainServiceBinder
   at com.example.ui.base.BaseServiceActivity$1.onServiceConnected(MainActivity.java:34)
   at android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1335)
   at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1352)
   at android.os.Handler.handleCallback(Handler.java:739)
   at android.os.Handler.dispatchMessage(Handler.java:95)
   at android.os.Looper.loop(Looper.java:158)
   at android.app.ActivityThread.main(ActivityThread.java:7224)

您可以将数组读入test.sh,如下所示:

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

它会向你抱怨("糟糕的替换"),但会起作用。