将命令行参数转换为Bash中的数组
将命令行参数转换为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
将命令行参数转换为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
。这对于在命令行上进行测试非常有用。谢谢。
将命令行参数转换为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`。
所以,通过上述的代码和解释,我们可以将命令行参数转换为数组并进行进一步处理。
将命令行参数转换为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++));
。