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

访问 bash 命令行参数 $@ vs $*

司寇星海
2023-03-14

在许多SO问题和bash教程中,我看到我可以通过两种方式访问bash脚本中的命令行参数:

$ ~ >cat testargs.sh 
#!/bin/bash

echo "you passed me" $*
echo "you passed me" $@

这导致:

$ ~> bash testargs.sh arg1 arg2
you passed me arg1 arg2
you passed me arg1 arg2

< code>$*和< code>$@有什么区别?< br >什么时候应该使用前者,什么时候应该使用后者?

共有3个答案

漆雕令秋
2023-03-14

$*

从1开始,扩展到位置参数。当在双引号中展开时,它会展开为一个单词,每个参数的值由IFS特殊变量的第一个字符分隔。也就是说,“$*”相当于“$1c$2c ...”,其中c是IFS变量值的第一个字符。如果未设置IFS,则参数用空格分隔。如果IFS为null,则连接参数时不插入分隔符。

$@

展开到位置参数,从一个开始。当扩展发生在双引号内时,每个参数将扩展为一个单独的单词。也就是说,“$@”相当于“$1”“$2”......如果双引号扩展发生在单词内,则第一个参数的扩展与原始单词的开头部分连接,最后一个参数的扩展与原始单词的最后一部分连接。当没有位置参数时,“$@”和$@将扩展到零(即,它们被删除)。

来源:巴什曼

单于奇略
2023-03-14

来自Bash黑客Wiki的一个很好的概览表:

佟阳飙
2023-03-14

当引用特殊参数时,差异就出现了。让我来说明不同之处:

$ set -- "arg  1" "arg  2" "arg  3"

$ for word in $*; do echo "$word"; done
arg
1
arg
2
arg
3

$ for word in $@; do echo "$word"; done
arg
1
arg
2
arg
3

$ for word in "$*"; do echo "$word"; done
arg  1 arg  2 arg  3

$ for word in "$@"; do echo "$word"; done
arg  1
arg  2
arg  3

关于引用重要性的另一个例子:请注意,“arg”和数字之间有2个空格,但如果我没有引用$word:

$ for word in "$@"; do echo $word; done
arg 1
arg 2
arg 3

在bash中,“$@”是要迭代的“默认”列表:

$ for word; do echo "$word"; done
arg  1
arg  2
arg  3
 类似资料:
  • Rust教程没有解释如何从命令行获取参数。在所有示例中,< code>fn main()只显示了一个空参数列表。 从 访问命令行参数的正确方法是什么?

  • 为了方便起见,我们支持在运行 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

  • V2Ray V2Ray 的程序文件的命令行参数如下: v2ray [-version] [-test] [-config=config.json] [-format=json] -version 只输出当前版本然后退出,不运行 V2Ray 主程序。 -test 测试配置文件有效性,如果有问题则输出错误信息,不运行 V2Ray 主程序。 -config 配置文件路径,可选的形式如下: 本地路径,可

  • 所有标志都是可选的,但是有些必须跟指定标志组合使用才生效。 标志 默认 描述 示例 --shell null 进入 REPL 模式 --allow-cors false 打开 CORS 兼容模式,这将允许从托管在任何域中的网站内连接到 Appium 服务器。启用此功能时要小心,因为如果您访问的网站使用跨域请求,在 Appium 服务器上启动或运行内省会话,则可能存在安全风险。 --ipa null