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

在linux外壳脚本中,$@和$*有什么区别?

暨鹭洋
2023-03-14

在“Linux Shell脚本编写指南”一书中

它说 $@ 扩展为 $1、$2、$3 等等,$* 扩展为 $1c$2c$3,其中 cIFS 的第一个字符。

$@$* 之间有什么区别,IFS 是什么意思?

共有2个答案

侯向文
2023-03-14

手册中给出的解释很难改进。例如,破折号(1)表示:

展开到位置参数,从1开始。当展开发生在双引号内时,每个位置参数都作为单独的参数展开。如果没有位置参数,则@的展开会生成零个参数,即使@是双引号。这基本上意味着什么,例如,如果1美元是“abc”并且2美元是“def ghi”,那么"$@"扩展到两个参数:"abc""def ghi"

我们可以通过一些示例演示$*$@之间的区别:

$ set 1 "2 3"
$ printf '"%s"\n' "$@"
"1"
"2 3"
$ printf '"%s"\n' $@
"1"
"2"
"3"
$ printf '"%s"\n' "$*"
"1 2 3"
$ printf '"%s"\n' $*
"1"
"2"
"3"

手册页还描述了IFS

输入字段分隔符。这通常设置为 ⟨空格⟩、⟨tab⟩ 和 ⟨换行符⟩。有关更多详细信息,请参阅空格拆分部分。

赵同
2023-03-14

IFS是内部字段分隔符,它基本上表示shell识别的分隔单词的内容。

所以要运行以下命令

IFS=$'\n'

会导致shell将新行识别为分隔符。

$是赋给变量的符号

然而,这些数字是为脚本输入保留的。

所以1美元是一个可变输入,2美元是第二个可变输入。

$@是传递给脚本的所有参数。

所以如果你运行这个命令

bash command.sh bork woof meow

这将是上面列出的变量的值

  $1 = bork
  $2 = woof
  $3 = meow
  $@ = bork woof meow
 类似资料:
  • 问题内容: 认为标题总结了问题:-) 问题答案: 脚本通常是直接运行的代码,由其本身运行。模块通常是由其他代码段导入的库。 请注意, 没有内部区别 -两者都是可执行的和可导入的,尽管直接执行时库代码通常不执行任何操作(或仅运行其单元测试),而导入设计为脚本的代码将导致其执行,因此通用测试。

  • 这些函数似乎在 React 教程中可以互换使用,但无法找出区别...或者什么时候使用哪个?

  • 我有一个谷歌表,我想从我们的服务器更新它的数据。目前我正在使用谷歌工作表脚本编辑器。 但是我开始意识到还有另一种方法可以更新我的谷歌表格。那就是使用谷歌表单apihttps://developers.google.com/sheets/api/samples/writinghttps://developers.google.com/sheets/api/reference/rest/https:/

  • 我是Rust的新手。我认为用于将标识符导入当前范围,用于声明外部模块。但是这种理解(可能是错误的)对我来说没有任何意义。有人能解释一下为什么Rust有这两个概念以及适合使用它们的情况吗?

  • 问题内容: 我只是想知道为什么我们通常在两个布尔之间使用逻辑OR 而不是按位OR ,尽管它们都运行良好。 我的意思是,请看以下内容: 我们可以代替使用吗?与和相同。 问题答案: 如果您使用和形式,而不是这些运算符的和形式,则Java不会费心地单独评估右手操作数。 这是您是否希望缩短评估时间的问题-在 大多数情况 下都是如此。 说明短路好处的一个好方法是考虑以下示例。 正如Jeremy和Peter提

  • 问题内容: Jenkins在调用命令时使用什么外壳?我在Linux机器上运行Jenkins。 问题答案: 从“执行外壳”部分的帮助/问号图标中: 运行用于构建项目的Shell脚本(默认为sh,但这是可配置的)。 如果转到Manage Jenkins-> Configure System,您将找到一个选项(称为“ Shell可执行文件”)来设置您希望您的Shell脚本使用的Shell的名称或绝对路径