[英]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.