论 $*、$@、"$*"、"$@"的区别

本文主要介绍了Shell中$*、$@、\$*\、\$@\的区别。不被双引号包围的$*和$@会对参数按空格拆分并去前后空格;被双引号包围的\$*\和\$@\则原封不动连接参数值,\$*\连成一体,\$@\能保留完整参数值,生产上\$@\使用最多。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

论 $*、$@、"$*"、"$@"的区别


$* 和 $@ 都表示传递给函数或脚本的所有参数

至于区别,先来看shell代码和执行结果

cd /home/hadoop/shell/examples
vim paramter2.sh

文件内容为:

#!/bin/bash
echo $*
echo $@
echo "$*"
echo "$@"

echo "-------- \$*不带双引号遍历--------"
for i in $*
do
  echo "$i"
done
echo "-------- \$@不带双引号遍历--------"
for i in $@
do
  echo "$i"
done

echo "----------\$*带双引号遍历--------"
for i in "$*"
do
  echo "$i"
done
echo "----------\$@带双引号遍历--------"
for i in "$@"
do
  echo "$i"
done

执行shell脚本【首先明确一点:给shell传入参数时,多个参数间是用空格隔开的】

cd /home/hadoop/shell/examples
sh paramter2.sh "abcdef" yyy
sh paramter2.sh "abc def" yyy
sh paramter2.sh "abc def  ghi" yyy
sh paramter2.sh " abc def  ghi" yyy
sh paramter2.sh " abc def  ghi " yyy

执行结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
从上面执行结果来看:
1)echo 直接输出$*、$@、" ∗ " 、 " *"、" ""@" ,它们之间是有区别的,都是将所有参数用空格连接成一份数据.连接前有些参数被处理过,有些没被处理,后面会给出总结。

使用 for 循环来逐个输出数据,更能看出区别来。
2)不被双引号""包围的 ∗ 和 *和 @ 是逐个对参数内部再按空格拆分,并去掉前后空格,然后连接在一起表示所有参数,遍历出来的参数个数和参数值都有可能跟输入时不一样了。
sh paramter2.sh " abc def ghi " yyy命令中,有两个参数。
第一个参数" abc def ghi "实际上是由3个字符串组成,abc与def之间有1个空格,def与ghi之间有2个空格,abc前面有1个空格,ghi后面有1个空格,会被处理成3个参数abcdefghi
第二个参数yyy,因为内部没有空格,前后也没空格,所以还是它自己。
所以被处理后的第一个参数分成了3个参数,加上第二个参数1个参数,一共4个参数,这4个参数空格连接在一起就是abc def ghi yyy

3)被双引号"“包围的”$*"、"$@“是把所有参数值原封不动(参数内部有空格不进行拆分,值前后的空格也都完整保留)的用空格连接成一份数据,只是”$*“连接成铁板一块,而”$@“还保留着连接点,还能获得某个完整参数值!!
sh paramter2.sh " abc def ghi " yyy命令中,有两个参数。
第一个参数" abc def ghi ",第二个参数yyy,用空格直接连接在一起为 abc def ghi yyy,这就是”$*"、"$@“的输出值。它们的差别在遍历的时候就能看出,”$*“只遍历出一个参数,即连接后的完整值,可以看出”$*“是将所有参数连接成铁板一块了;而”$@"遍历出2个参数,每个参数就是之前的参数输入值

总结:
1)$*、$@ 、"$*"、"$@“都表示传递给函数或脚本的所有参数,即都会将所有参数处理成一份数据。
2)不被双引号”"包围的$*和$@,会对每个参数进行处理,逢空格必拆开,去前后空格,最后会被处理的连爹妈都认不出来。可以说家教严格,稍带空格就会被修理,哈哈~~

3)被双引号"“包围的”$*"、"$@",不会对每个参数进行处理,而仅仅是将所有参数值原封不动的用空格连接成一份数据,只是"$*“连接成铁板一块,而”$@“还能获取到每个完整的参数值!!
所以”$*“是被合并的连爹妈都认不出来,而”$@"还能被爹妈准确认领出来的,哈哈!!

反正我就记忆完整性最好的是"$@",参数值唯一能被爹妈准确认领出来的。在生产上,也是用"$@"最多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值