跳过正文
  1. Posts/

$*,$@,傻傻分不清楚?

·534 字·2 分钟· loading · loading ·
Shell Bash Zsh Shell
uzvg
作者
uzvg
A little bit about me
目录

刚开始学习Linux Shell的时候,有两个变量总是让人傻傻分不清楚,它们就是$@$*,还有"$@""$*"

结论:
#

先说结论,网上的解释一大堆,但其实可以用两句话来概括:

  • 不加引号的时候,$@$*的作用一致
  • 加引号的时候,"$@"的作用仍然跟$@保持一致,没发生变化,而"$*"会将所有参数视为单个完整参数。

示例:
#

新建如下脚本文件test.sh

#!/usr/bin/bash
count=1
for name in $*
do
  echo "Parameter #$count = $name"
   (( count++ ))
done
echo "=============================="
count=1
for name in $@
do
  echo "Parameter #$count = $name"
  (( count = count+1 ))
done

使用chmod+x test.sh使其具有执行权限,然后:

./test.sh zhangsan lisi wangmazi ergouzi

可以看到如下结果:

❯❯❯ ./test2.sh zhangsan lisi wangmazi ergouzi
Parameter #1 = zhangsan
Parameter #2 = lisi
Parameter #3 = wangmazi
Parameter #4 = ergouzi
==============================
Parameter #1 = zhangsan
Parameter #2 = lisi
Parameter #3 = wangmazi
Parameter #4 = ergouzi

可以看到,在没有引号的情况下,$@跟$*的作用是一致的,都是将传入的参数单个区分对待。

再然后分将其中的$@$*两边加上引号,如下:

#!/usr/bin/bash
count=1
for name in "$*"
do
  echo "Parameter #$count = $name"
   (( count++ ))
done

echo "=============================="
count=1
for name in "$@"
do
  echo "Parameter #$count = $na**me"
  (( count = count+1 ))
done

再次执行,可以看到如下结果:

❯❯❯ ./test2.sh zhangsan lisi wangmazi ergouzi
Parameter #1 = zhangsan lisi wangmazi ergouzi
==============================
Parameter #1 = zhangsan
Parameter #2 = lisi
Parameter #3 = wangmazi
Parameter #4 = ergouzi

可以看到,与没有引号的$*不同,"$*"会将传入的所有参数,当成单个整体的参数来对待。