shell 在Bash中将命令行参数转换为数组

kqhtkvqz  于 2023-01-02  发布在  Shell
关注(0)|答案(7)|浏览(297)

如何将命令行参数转换为bash脚本数组?
我想接这个电话

./something.sh arg1 arg2 arg3

并将其转换为

myArray=( arg1 arg2 arg3 )

这样我就可以在脚本中进一步使用myArray。
上一篇SO文章很接近,但没有详细介绍如何创建阵列:How do I parse command line arguments in Bash?
我需要将参数转换为一个常规的bash脚本数组;我意识到我可以使用其他语言(例如Python),但需要在bash中完成这一点。我猜我正在寻找一个"append"函数或类似的东西?
UPDATE:我还想问一下如何检查零参数并分配一个默认数组值,多亏了下面的答案,我才能让它工作起来:

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

xxls0lw81#

实际上你的命令行参数已经 * 几乎 * 像一个数组了。至少,你可以把$@变量当作一个数组来对待。也就是说,你可以把它转换成一个实际的数组,如下所示:

myArray=( "$@" )

如果只想输入一些参数并将其输入到$@值中,请使用set

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

理解如何使用参数结构在POSIX sh中特别有用,因为它没有数组这样的东西。

pobjuy32

pobjuy322#

也许这能帮上忙:

myArray=("$@")

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

for arg; do
   echo "$arg"
done

将等同于

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

4uqofj5v3#

实际上,参数列表可以使用$1 $2 ...等进行访问。
它完全等同于:

${!i}

因此,参数列表可以随set而改变,
${!i}是访问它们的正确方法:
x一个一个一个一个x一个一个二个x
对于您的特定情况,可以使用此函数(不需要数组)来设置参数列表(如果未给定任何参数):

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

它可以转化为更简单的表达式:

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

2skhul334#

下面是另一种用法:

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

puruo6ea5#

更简单不过,您可以直接在$@上操作;)
下面是如何从提示符直接传递一个参数列表:

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

3z6pesqy6#

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

#!/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.
>
chhkpiq4

chhkpiq47#

数组和$@实际上相同的并排视图。
代码:

#!/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

相关问题