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

30 浏览
0 Comments

将命令行参数转换为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中进行。我猜我在寻找一个"append"函数或类似的东西?

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

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

0
0 Comments

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

实际上,您的命令行参数在实际上就像一个数组一样。至少,您可以像处理数组一样处理$@变量。也就是说,您可以通过以下方式将其转换为实际的数组:

myArray=( "$@" )

如果您只想输入一些参数并将它们传递给$@的值,请使用set

$ set -- apple banana "kiwi fruit"
$ echo "$#"
3
$ echo "$@"
apple banana kiwi fruit
$ for arg in "${@}"; do echo -n ", $arg"; done
, apple, banana, kiwi, fruit

了解如何使用参数结构在POSIX sh中特别有用,因为它没有其他像数组一样的东西。

谢谢!运行得很好!我正要问如何检查零个参数并赋予默认数组值,$#对此非常完美!

set允许您设置作用域的位置参数。它还允许您设置shell选项。您可以执行set foo,这意味着$1会展开为"foo",但如果参数以短划线开头,则set将假定您是要设置一个shell选项。双破折号确保所有后续参数都被解释为要设置的位置参数。

一个注意事项:echo $@将打印所有参数,但echo $myArray只会打印第一个元素。要查看所有元素,请使用echo ${myArray[@]}

如果您在这些扩展周围不加双引号,则bash将重新对它们进行单词拆分,并可能丧失含义。

是的,"${myArray[@]}"是“展开”数组并使用每个元素的通用方法。如果要循环遍历数组,您需要使用引号来避免在IFS上拆分其各个元素。

这非常方便。我一直在努力找到如何打印每个元素作为参数传递的索引号。您只需将参数传递到数组中,然后就可以做到。很容易。非常方便,这是我一直在寻找的解决方案!

我也不知道set。这对于在命令行上进行测试非常有用。谢谢。

0
0 Comments

将命令行参数转换为Bash中的数组的方法和原因

在Bash中,有时候我们需要将命令行传递的参数转换为数组进行处理。下面的内容提供了一种方法来实现这个目标:

myArray=("$@") 

这段代码使用了特殊变量`"$@"`,它表示命令行中传递的所有参数。通过将`"$@"`赋值给数组`myArray`,我们就可以将命令行参数转换为数组。

此外,我们还可以使用循环来遍历命令行参数,代码如下:

for arg; do
   echo "$arg"
done

这段代码中省略了`in`关键字,循环会自动遍历命令行参数。每次循环,`arg`变量会被赋值为当前参数的值,通过`echo "$arg"`可以打印出参数的值。

上面的代码与下面的代码是等价的:

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

在这段代码中,使用了`"${@}"`来表示整个命令行参数数组。循环会依次将数组中的每个元素赋值给`arg`变量,并打印出参数的值。

对于新手来说,可能会有一些问题。例如,Bash是如何知道将命令行参数赋值给`arg`变量的?这是否是一个预定义变量?

实际上,`${var}`表示将变量`var`的内容展开。`${var[n]}`表示将数组`var`的第`n`个元素的内容展开。那么`${var[@]}`是否展开整个数组呢?也就是说,`${var[@]}`是否等同于`${var[0]} ${var[1]} ... ${var[n]}`(其中`n`是数组的最后一个元素的索引)?

在这个问题中,`for`循环省略了`in`关键字,循环会遍历命令行参数数组`$@`(`$1`、`$2`等)。这个数组也可以通过`set`命令进行设置,例如`set -- arg1 arg2`。

所以,通过上述的代码和解释,我们可以将命令行参数转换为数组并进行进一步处理。

0
0 Comments

将命令行参数转换为Bash数组的方法。

在Bash中,可以使用$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

最后,有人指出在示例中的echo语句应该是echo "$#" "$i+1" "${!i}";才能得到与输出相符的结果。确实,在for循环中有一个错误,应该从1开始初始化i,即for((i=1;i<=$#;i++));

0