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

我想说:

./something.sh arg1 arg2 arg3

并将其转换为

myArray=( arg1 arg2 arg3 )

这样我就可以使用myArray在脚本中进一步使用。

这之前的SO帖子接近,但没有进入如何创建一个数组:我如何在Bash中解析命令行参数?

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

更新:我还想问如何检查零参数和分配默认数组值,感谢下面的答案,能够得到这个工作:

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

当前回答

下面是另一个用法:

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

其他回答

实际上,参数列表可以用$1 $2…等。 这完全等价于:

${!i}

因此,参数列表可以通过set和${!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

更简单的是,你可以直接操作$@;)

下面是如何直接从提示符中传递一个参数列表:

function echoarg { for stuff in "$@" ; do echo $stuff ; done ; } 
    echoarg Hey Ho Lets Go
    Hey
    Ho
    Lets
    Go

实际上,你的命令行参数实际上就像一个数组。至少,您可以像对待数组一样对待$@变量。也就是说,你可以把它转换成一个实际的数组,像这样:

myArray=( "$@" )

如果你只是想输入一些参数并将它们输入到$@值中,使用set:

$ set -- apple banana "kiwi fruit"
$ echo "$#"
3
$ echo "$@"
apple banana kiwi fruit

了解如何使用参数结构在POSIX sh中特别有用,因为它没有数组。

下面是另一个用法:

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

也许这可以有所帮助:

myArray=("$@") 

你也可以通过省略'in'来迭代参数:

for arg; do
   echo "$arg"
done

将是等价的

for arg in "${@}"; do
   echo "$arg"
done