当前位置: 首页 > news >正文

在shell脚本中,$@和$#的区别与联系

在 Shell 脚本里,$@ 和 $* 都是用于表示传递给脚本或函数的所有参数,下面详细介绍它们的区别与联系。

联系

  • 表示所有参数:二者都能够代表传递给脚本或者函数的全部参数。当你在执行脚本时带上了多个参数,$@ 和 $* 都能把这些参数呈现出来。
  • 未加引号时行为一致:在没有被双引号 " " 引用的情况下,$@ 和 $* 表现一样,都会把所有参数展开为以空格分隔的列表。

示例代码如下:

bash

#!/bin/bash
# 遍历 $@ 未加引号的情况
echo "未加引号时遍历 \$@"
for arg in $@; do
    echo $arg
done

# 遍历 $* 未加引号的情况
echo "未加引号时遍历 \$*"
for arg in $*; do
    echo $arg
done

将上述代码保存为 test.sh,执行 bash test.sh "hello world" foo bar,输出结果如下:

plaintext

未加引号时遍历 $@
hello
world
foo
bar
未加引号时遍历 $*
hello
world
foo
bar

区别

主要区别体现在被双引号 " " 引用时:

  • "$@":把每个参数当作独立个体来保留,它会将所有参数展开成多个独立的字符串,并且维持参数原本的分隔状态。在需要对每个参数单独处理时,使用 "$@" 十分合适。
  • "$*":会把所有参数合并成一个字符串,各个参数之间由 IFS(内部字段分隔符,默认是空格、制表符和换行符)的第一个字符分隔。

示例代码如下:

bash

#!/bin/bash
# 遍历 "$@"
echo "加引号时遍历 \"\$@\""
for arg in "$@"; do
    echo $arg
done

# 遍历 "$*"
echo "加引号时遍历 \"\$*\""
for arg in "$*"; do
    echo $arg
done

将上述代码保存为 test2.sh,执行 bash test2.sh "hello world" foo bar,输出结果如下:

plaintext

加引号时遍历 "$@"
hello world
foo
bar
加引号时遍历 "$*"
hello world foo bar

综上所述,$@ 和 $* 在未加引号时表现一致,加引号后行为不同。若要对每个参数分别处理,推荐使用 "$@";若要把所有参数作为一个整体处理,可使用 "$*"

相关文章:

  • 【Python中读取并显示遥感影像】
  • 数据库基线检查-MongoBD/Kingbaser人大金仓/Oracel/PostgreSQL/Mysql安全加固
  • 【C++】Stack Queue 仿函数
  • linux下MMC_TEST的使用
  • skynet.rawcall使用详解及应用场景
  • jspm会计凭证自动录入预处理系统(源码+lw+部署文档+讲解),源码可白嫖!
  • mindie1.0新特性及调试问题总结
  • 鸿蒙app开发中Emitter 订阅器
  • Reactive编程框架与工具
  • Java 集合介绍
  • Linux--文件系统
  • 第四章 结构化程序设计
  • 【数据挖掘】岭回归(Ridge Regression)和线性回归(Linear Regression)对比实验
  • TBE(TVM的扩展)
  • 滑动窗口滤波
  • OpenIPC开源FPV之Adaptive-Link日志分析
  • 【Linux操作系统】:信号
  • 【Java设计模式】第10章 外观模式讲解
  • C++进阶笔记第一篇:程序的内存模型
  • 简单回溯(组合力扣77)
  • 上市不足一年,吉利汽车拟私有化极氪并合并:整合资源,杜绝重复投入
  • 男子煎服15克山豆根中毒送医,医生:不能盲目相信偏方
  • 住宿行业迎“最火五一”:数千家酒店连续3天满房,民宿预订量创历史新高
  • 涉个人信息收集使用问题,15款App和16款SDK被通报
  • 中标多家学校采购项目的App查成绩需付费?涉事公司回应
  • 被炒热的“高潮针”:超适应症使用,安全性和有效性存疑