如何将命令行参数转换为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

当前回答

也许这可以有所帮助:

myArray=("$@") 

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

for arg; do
   echo "$arg"
done

将是等价的

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

其他回答

双引号的重要性值得强调。假设一个参数包含空格。

代码:

#!/bin/bash
printf 'arguments:%s\n' "$@"
declare -a arrayGOOD=( "$@" )
declare -a arrayBAAD=(  $@  )

printf '\n%s:\n' arrayGOOD
declare -p arrayGOOD
arrayGOODlength=${#arrayGOOD[@]}
for (( i=1; i<${arrayGOODlength}+1; i++ ));
do
   echo "${arrayGOOD[$i-1]}"
done

printf '\n%s:\n' arrayBAAD
declare -p arrayBAAD
arrayBAADlength=${#arrayBAAD[@]}
for (( i=1; i<${arrayBAADlength}+1; i++ ));
do
   echo "${arrayBAAD[$i-1]}"
done

输出:

> ./bash-array-practice.sh 'The dog ate the "flea" -- and ' the mouse.
arguments:The dog ate the "flea" -- and 
arguments:the
arguments:mouse.

arrayGOOD:
declare -a arrayGOOD='([0]="The dog ate the \"flea\" -- and " [1]="the" [2]="mouse.")'
The dog ate the "flea" -- and 
the
mouse.

arrayBAAD:
declare -a arrayBAAD='([0]="The" [1]="dog" [2]="ate" [3]="the" [4]="\"flea\"" [5]="--" [6]="and" [7]="the" [8]="mouse.")'
The
dog
ate
the
"flea"
--
and
the
mouse.
> 

并排查看数组和$@实际上是相同的。

代码:

#!/bin/bash

echo "Dollar-1 : $1"
echo "Dollar-2 : $2"
echo "Dollar-3 : $3"
echo "Dollar-AT: $@"
echo ""

myArray=( "$@" )

echo "A Val 0: ${myArray[0]}"
echo "A Val 1: ${myArray[1]}"
echo "A Val 2: ${myArray[2]}"
echo "A All Values: ${myArray[@]}"

输入:

./bash-array-practice.sh 1 2 3 4

输出:

Dollar-1 : 1
Dollar-2 : 2
Dollar-3 : 3
Dollar-AT: 1 2 3 4

A Val 0: 1
A Val 1: 2
A Val 2: 3
A All Values: 1 2 3 4

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

myArray=( "$@" )

如果你只是想输入一些参数并将它们输入到$@值中,使用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 "${@}"; do
   echo "$arg"
done

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

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

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