簡體   English   中英

如何將正常的args和數組都傳遞給bash腳本參數?

[英]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$1arg2$2arr1$3 $4 $5 ... ,具體取決於陣列的長度。 shift會將所有參數向下移動1,對於你擁有的所有參數,使得1=$2 2=$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 )) ,然后使用${@:1:$size} shift並獲取數組,來了解這對數組中可變數量的元素是如何工作的。 ${@:1:$size}然后執行((size--))shift $size以使用下一個數組大小和數組重新開始。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM