将命令行参数转换成Bash中的数组

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

我想要这个:

./something.sh arg1 arg2 arg3 

并将其转换为

 myArray=( arg1 arg2 arg3 ) 

以便我可以使用myArray在脚本中进一步使用。

这个以前的SOpost接近,但没有进入如何创build一个数组: 如何parsingBash中的命令行参数?

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

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

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

其实你的命令行参数实际上已经像一个数组了。 至less,你可以把$@variables看作一个数组。 也就是说,你可以把它转换成一个像这样的实际数组:

 myArray=( "$@" ) 

如果你只是想input一些参数并把它们input到$@值中,使用set

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

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

也许这可以帮助:

 myArray=("$@") 

你也可以通过省略'in'来遍历参数:

 for arg; do echo "$arg" done 

将是等同的

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

其实参数列表可以用$ 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 

这转化为更简单的expression式:

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

这是另一个用法:

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

更容易,但你可以直接运行$ @;)

这里是如何直接从提示中传递一个参数列表:

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