如何将普通的args和array都传递给bash脚本参数?

时间:2018-07-05 21:11:35

标签: arrays bash arguments

我正在尝试使用具有某些参数的bash脚本。其中一个需要是一个数组,因此args的数量在该数组中不是固定的。

所以我想按如下方式运行我的bash脚本:

test.sh arg1 arg2 arr1

在test.sh内,我正在做类似的事情

arg1=$1
arg2=$2

arr=$3 # arr1
for var in len(arr)
do
 # do something
done

2 个答案:

答案 0 :(得分:2)

#!/bin/bash

arg1=$1
arg2=$2

shift 2

for argn do
    # do something with "$argn"
done

也就是说,首先接收两个固定参数,然后使用shift 2将其移出位置参数列表。位置参数列表中剩下的是其他参数的可变长度列表。

可以写出最后一个循环

for argn in "$@"; do
    # do something with "$argn"
done

...,但是请确保使用"$@"而不是$@,因为那样会在空格上分割各个参数并调用文件名范围。

答案 1 :(得分:1)

您传递给脚本的方法有效。您可以将脚本重写为

#!/bin/bash 
arg1=$1
arg2=$2
for i in $(seq 3 $#); do
     #reference each thing in arr1 with ${!i}
done

尽管那很难读。 {!var}是间接的(基本上,您问i等于什么,然后问等于 等于什么,所以如果i=1,您在做${!i}$1相同)。

但是,这不能将数组保持在一起。如果您需要arr1保留脚本中的arr1,则可以执行以下操作:

#!/bin/bash 
arg1=$1
shift
arg2=$1
shift
arr1=("$@")

Bash通过相对于脚本名称(获取变量$0)的位置来获取命令行参数。对于您的方案,根据数组的长度,arg1$1arg2$2arr1$3 $4 $5 ...shift将所有参数向下移动1,使您拥有的所有参数分别为1=$22=$3等。 (它不会更改脚本名称中的$0;保持不变。)

$@捕获所有从$1开始的命令行变量。但是,由于我们移走了arg1arg2的变量,因此抓取所有变量确实意味着我们只抓取了最初属于数组的变量。

如果您有多个数组,或者该数组位于列表的第一位,那么您必须知道数组中有多少个元素才能工作。假设您想做test.sh arr1 var1 arr2,并且知道两个数组的长度均为3:

#!/bin/bash 
arr1=("${@:1:4}")
shift ${#arr1[@]} #shift by the length of arr1
arg1=$1
shift
arr2=("$@")

希望您可以通过先传递数组的长度,用size=$(( 1 + $1 ))来抓取数组的长度,然后shift来抓取数组,以了解如何处理数组中可变数量的元素${@:1:$size},然后进行((size--))shift $size,以下一个数组大小和数组重新开始。