shell 脚本中的 $@ 是什么意思?
- 2024-10-10 09:29:00
- admin 原创
- 79
问题描述:
@
在 shell 脚本中,美元符号后跟 at 符号 ( ) 是什么意思?
例如:
umbrella_corp_options $@
解决方案 1:
$@
是传递给脚本的所有参数。
例如,如果您调用./someScript.sh foo bar
,那么$@
将等于foo bar
。
如果你这样做:
./someScript.sh foo bar
然后是内部someScript.sh
引用:
umbrella_corp_options "$@"
这将传递给umbrella_corp_options
每个用双引号括起来的单独参数,从而允许从调用者那里获取带有空格的参数并传递它们。
解决方案 2:
$@
与 几乎相同$*
,都表示“所有命令行参数”。它们通常用于将所有参数简单地传递给另一个程序(从而形成该程序的包装器)。
当您的参数中包含空格(例如)并放在$@
双引号中时,两种语法之间的差异就会显现出来:
wrappedProgram "$@"
# ^^^ this is correct and will hand over all arguments in the way
# we received them, i. e. as several arguments, each of them
# containing all the spaces and other uglinesses they have.
wrappedProgram "$*"
# ^^^ this will hand over exactly one argument, containing all
# original arguments, separated by single spaces.
wrappedProgram $*
# ^^^ this will join all arguments by single spaces as well and
# will then split the string as the shell does on the command
# line, thus it will split an argument containing spaces into
# several arguments.
示例:调用
wrapper "one two three" four five "six seven"
将导致:
"$@": wrappedProgram "one two three" four five "six seven"
"$*": wrappedProgram "one two three four five six seven"
^^^^ These spaces are part of the first
argument and are not changed.
$*: wrappedProgram one two three four five six seven
解决方案 3:
这些是命令行参数,其中:
$@
= 将所有参数存储在字符串列表中
$*
= 将所有参数存储为单个字符串
$#
= 存储参数的数量
解决方案 4:
意义。
简而言之,$@
扩展为从调用者传递给函数或脚本的参数。其含义与上下文相关**:在函数内部,它扩展为传递给该函数的参数。如果在脚本中使用(在函数外部),它扩展为传递给该脚本的参数。
$ cat my-script
#! /bin/sh
echo "$@"
$ ./my-script "Hi!"
Hi!
$ put () { echo "$@"; }
$ put "Hi!"
Hi!
* 注意:单词拆分。
shell 根据IFS
环境变量的内容拆分标记。其默认值为 ` ;即空格、制表符和换行符。扩展
"$@"会为您提供传递的参数的***原始副本***
$@。扩展可能不会。更具体地说,任何包含 中的字符的参数都
IFS`可能拆分为两个或多个参数或被截断。
因此,大多数时候您想要使用的是"$@"
,而不是$@
。
解决方案 5:
在大多数情况下,使用纯$@
意味着“尽可能地伤害程序员”,因为在大多数情况下,它会导致单词分离以及参数中的空格和其他字符的问题。
在(猜测) 99% 的所有情况下,都需要将其括在"
:中"$@"
,才能用于可靠地迭代参数。
for a in "$@"; do something_with "$a"; done
解决方案 6:
来自手册:
@
扩展为位置参数,从 1 开始。当扩展发生在双引号内时,每个参数都会扩展为一个单独的单词。也就是说,“$@”相当于“$1”“$2”……如果双引号扩展发生在单词内,则第一个参数的扩展与原始单词的开头部分连接,最后一个参数的扩展与原始单词的末尾部分连接。当没有位置参数时,“$@”和 $@ 扩展为空(即它们被删除)。
解决方案 7:
$@
基本上用于引用 shell 脚本的所有命令行参数。$1 , $2 , $3
引用第一个命令行参数、第二个命令行参数、第三个参数。
解决方案 8:
它们通常用于简单地将所有参数传递给另一个程序
[root@node1 shell]# ./my-script hi 11 33 hi 11 33 [root@node1
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件