2012-10-03 57 views
94

如何将命令行参数转换为bash脚本数组?在Bash中将命令行参数转换为数组

我想借此:

./something.sh arg1 arg2 arg3 

并将其转换为

myArray=(arg1 arg2 arg3) 

,这样我可以用myArray的为脚本中的进一步使用。

此之前的SO后接近,但不进入如何创建一个数组:How do I parse command line arguments in Bash?

我需要的参数转换为常规bash脚本阵列;我意识到我可以使用其他语言(例如Python),但需要在bash中执行此操作。我想我正在寻找一个“追加”功能或类似的东西?

更新:我也想问如何检查零个参数,并指定一个默认的数组值,并且由于下面的答案,能得到这个工作:

if [ "$#" -eq 0 ]; then 
    myArray=(defaultarg1 defaultarg2) 
else 
    myArray=("[email protected]") 
fi 

回答

126

其实你的命令行参数实际上是就像一个数组已经。至少,你可以将[email protected]变量看作一个数组。这就是说,你可以将其转换为实际的数组是这样的:

myArray=("[email protected]") 

如果你只是想输入一些参数并将其送入[email protected]值,使用set

$ set -- apple banana "kiwi fruit" 
$ echo "$#" 
3 
$ echo "[email protected]" 
apple banana kiwi fruit 

了解如何使用参数结构在POSIX sh中是特别有用的,它没有其他任何数组。

+1

谢谢!很棒!正要问如何检查零参数并分配一个默认数组值,而$#完全适用于此! – Suman

+0

@kojiro set的含义是什么 - ,谢谢 – mailzyok

+1

'set'允许你为范围设置位置参数。它还可以让你设置shell选项。你可以执行'set foo',这意味着'$ 1'扩展为'foo',但是如果你的参数以'set'开头,将假定你的意思是设置一个shell选项。双短划线确保将以下所有参数解释为要设置的位置参数。 – kojiro

35

也许这可以帮助:

myArray=("[email protected]") 

,你也可以通过参数迭代通过省略 '在':

for arg; do 
    echo "$arg" 
done 

将相当于

for arg in "${myArray[@]}"; do 
    echo "$arg" 
done 
+0

我发现第二个很棒 – goofansu

+0

新手问题:bash如何知道将什么放入'arg'字段 - 它是一个预定义的变量吗? '$ {var}'被扩展为'var'的内容。 '$ {var [n]}'被扩展到数组'var'的元素'n'的内容。 '$ {var {@]}'然后展开整个数组,例如'$ {var [0]} $ {var [1]} ... $ {var [n]}'(用'n'作为最后一个元素的索引)? – Christian

+0

[for] without [in]将循环参数数组$($ 1,$ 2等)。也可以用[set]命令设置,例如set - arg1 arg2 –

4

这里是另一个用法:

#!/bin/bash 
array=("[email protected]") 
arraylength=${#array[@]} 
for ((i=1; i<${arraylength}+1; i++)); 
do 
    echo "${array[$i-1]}" 
done 
6

其实参数列表可以用$1 $2 ...等来访问
这是完全等同于:

${!i} 

因此,参数列表可以用一组被改变,
${!i}是访问它们的正确方法:对于

$ set -- aa bb cc dd 55 ff gg hh ii jjj kkk lll 
$ for ((i=0;i<=$#;i++)); do echo "$#" "$i" "${!i}"; done 
12 1 aa 
12 2 bb 
12 3 cc 
12 4 dd 
12 5 55 
12 6 ff 
12 7 gg 
12 8 hh 
12 9 ii 
12 10 jjj 
12 11 kkk 
12 12 lll 

您具体而言,这可以用来(无需阵列),设定的参数列表给出无时:

if [ "$#" -eq 0 ]; then 
    set -- defaultarg1 defaultarg2 
fi 

它转换为这种更简单的表达:

[ "$#" == "0" ] && set -- defaultarg1 defaultarg2 
4

更容易不过,你可以在[email protected]直接操作;)

这里是如何做到直接从提示通过参数的个数AA名单:

function echoarg { for stuff in "[email protected]" ; do echo $stuff ; done ; } 
echoarg Hey Ho Lets Go 
    Hey 
    Ho 
    Lets 
    Go