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



评论前必须登录!
注册