Shell 中 $@ 和 $* 的区别

Shell 中 $@ 和 $* 的区别

$@$*都表示所有位置参数,但它们有一个关键区别:

$@把每个参数当作独立的个体("各自为政"),$*把全部参数当成一个整体("打包处理")。

变量行为什么时候用
$@每个参数独立,保持空格和引号推荐,大多数场景
$*所有参数合并成一个字符串需要把所有参数当整体时

二、示例

脚本

#!/bin/bash # test.sh echo "=== 测试 \$@ ===" for arg in "$@"; do echo "参数: $arg" done echo "" echo "=== 测试 \$* ===" for arg in "$*"; do echo "参数: $arg" done

运行脚本

./test.sh a b c

输出

=== 测试 $@ === 参数: a 参数: b 参数: c === 测试 $* === 参数: a b c
  • $@:每个参数单独一行

  • $*:所有参数合并成一个

但没有引号时差异更明显

带空格和引号的参数

./test.sh "hello world" "foo bar"

输出

=== 测试 $@ === 参数: hello world 参数: foo bar === 测试 $* === 参数: hello world foo bar
  • $@:保持了每个参数的引号,"hello world"作为一个整体

  • $*:把所有东西合并成一个字符串

区别的本质

变量存储方式相当于
"$@"["hello world", "foo bar"]每个参数独立,像列表
"$*"["hello world foo bar"]全部拼成一个字符串,像单个元素

$@是一组,$*是一坨。大多数情况下用"$@"就可以了。