[英]How can I pass normal args and array both to the bash script arguments?
我想要一个有一些args的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
#!/bin/bash
arg1=$1
arg2=$2
shift 2
for argn do
# do something with "$argn"
done
也就是说,首先接收两个固定的参数,然后使用shift 2
将它们从位置参数列表中shift 2
。 位置参数列表中剩下的是其他参数的可变长度列表。
可以写出最后一个循环
for argn in "$@"; do
# do something with "$argn"
done
...但请确保使用"$@"
而不仅仅是$@
因为这会将空格上的各个参数拆分并调用文件名通配符。
传递给脚本的方法是有效的。 您可以将脚本重写为
#!/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
为$1
, arg2
为$2
, arr1
为$3 $4 $5 ...
,具体取决于阵列的长度。 shift
会将所有参数向下移动1,对于你拥有的所有参数,使得1=$2
2=$3
等。 (它不会从脚本名称更改$0
;它保持不变。)
$@
抓取所有命令行变量,从$1
开始。 但是,因为我们移走了arg1
和arg2
,所以抓住所有变量实际上意味着我们只抓取最初属于数组的变量。
如果您有多个数组,或者数组是列表中的第一个数组,那么您必须知道数组中有多少元素才能工作。 假设你想做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 ))
,然后使用${@:1:$size}
shift
并获取数组,来了解这对数组中可变数量的元素是如何工作的。 ${@:1:$size}
然后执行((size--))
并shift $size
以使用下一个数组大小和数组重新开始。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.