当前位置: 首页 > 知识库问答 >
问题:

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

公羊玉泽
2023-03-14

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

共有3个答案

施景同
2023-03-14

实际上,参数列表可以通过$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

席兴平
2023-03-14

也许这会有帮助:

myArray=("$@") 

您还可以通过省略“in”来迭代参数:

for arg; do
   echo "$arg"
done

会是等价的

for arg in "${myArray[@]}"; do
   echo "$arg"
done
孙帅
2023-03-14

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

myArray=( "$@" )

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

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

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

 类似资料:
  • 在许多SO问题和bash教程中,我看到我可以通过两种方式访问bash脚本中的命令行参数: 这导致: < code>$*和< code>$@有什么区别?< br >什么时候应该使用前者,什么时候应该使用后者?

  • 这是我得到的问题“编写一个程序来读取和显示2个命令行参数和命令行参数数组的长度”。 这是我用Java给出的答案。。这是正确的吗?

  • 问题内容: 我正在使用getopt处理命令行可选参数,该参数应接受列表。像这样: 但这会修剪“ [1,”之后的所有内容 我的问题是:A)有没有一种方法可以指定列表而不将其转换为字符串?(使用getopt) B)如果我要将列表转换成字符串,如何将这个列表转换成字符串?例如像mylist.split(“?”)这样的东西可以消除方括号?有没有更好的办法? 谢谢 问题答案: 我可以想到两种选择: 使用op

  • 为了方便起见,我们支持在运行 Blade 应用的时候修改一些配置,比如我在运行时指定端口: java -jar blade-app.jar --server.port=9088 当然还支持一些其他的命令行参数,看看下面的表格: 命令行参数 描述 示例 server.address 服务地址,默认是本机 0.0.0.0 回环地址 --server.address=192.168.1.100 serv

  • 1.2. 命令行参数 大多数的程序都是处理输入,产生输出;这也正是“计算”的定义。但是, 程序如何获取要处理的输入数据呢?一些程序生成自己的数据,但通常情况下,输入来自于程序外部:文件、网络连接、其它程序的输出、敲键盘的用户、命令行参数或其它类似输入源。下面几个例子会讨论其中几个输入源,首先是命令行参数。 os包以跨平台的方式,提供了一些与操作系统交互的函数和变量。程序的命令行参数可从os包的Ar

  • '-m' 选项 显示所有编译的模块,自1.4.0以来,Tengine支持动态模块,static表示静态编译,shared表示动态编译(后面接的是动态模块的版本)。下面是例子: $ nginx -m Tengine version: Tengine/1.4.1 (nginx/1.2.3) loaded modules: ngx_core_module (static) ng