$@和$*都表示所有位置参数,但它们有一个关键区别:
$@把每个参数当作独立的个体("各自为政"),$*把全部参数当成一个整体("打包处理")。
| 变量 | 行为 | 什么时候用 |
|---|---|---|
$@ | 每个参数独立,保持空格和引号 | 推荐,大多数场景 |
$* | 所有参数合并成一个字符串 | 需要把所有参数当整体时 |
二、示例
脚本
#!/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"] | 全部拼成一个字符串,像单个元素 |
$@是一组,$*是一坨。大多数情况下用"$@"就可以了。