Shell 中 $*
、$@
、"$*"
和 "$@"
的区别
在 Shell 脚本编程中,参数传递是常见操作,其中 $*
、$@
、"$*"
和 "$@"
是处理位置参数的重要工具。虽然它们看似相似,但实际行为却有明显差异。理解它们的区别对于编写高效的脚本至关重要。
1 基本定义
-
$*
和$@
它们用于表示脚本接收到的所有位置参数:$*
将所有参数视为一个整体。$@
将所有参数视为独立的个体。
-
加引号的版本:
"$*"
和"$@"
当这些变量被双引号包裹时,其行为会发生变化:"$*"
将所有参数作为一个单独的字符串。"$@"
保留参数的独立性,每个参数仍然是独立的字符串。
2 具体区别
-
未加引号的
$*
和$@
$*
会将所有参数拼接为一个字符串,用第一个字符作为分隔符(通常是空格)。$@
和$*
在未加引号时的表现一致,即简单地按位置展开所有参数,默认使用空格分隔。
-
加引号的
"$*"
和"$@"
"$*"
会将所有参数合并为一个字符串,参数间用一个空格分隔。"$@"
会保留参数的分隔性,每个参数在扩展时被单独加引号处理。
3 代码示例
以下代码演示了它们在不同情况下的行为:
#!/bin/bash
echo "Using \$*:"
for arg in $*; do
echo "$arg"
done
echo "Using \$@:"
for arg in $@; do
echo "$arg"
done
echo 'Using "$*":'
for arg in "$*"; do
echo "$arg"
done
echo 'Using "$@":'
for arg in "$@"; do
echo "$arg"
done
执行脚本并传入以下参数:
bash script.sh "arg1" "arg 2" "arg3"
输出分析:
Using $*:
arg1
arg
2
arg3
Using $@:
arg1
arg
2
arg3
Using "$*":
arg1 arg 2 arg3
Using "$@":
arg1
arg 2
arg3
-
$*
的行为:arg1
arg
2
arg3
(参数被拆分)
-
$@
的行为:- 与
$*
一致。 - 输出相同。
- 与
-
"$*"
的行为:arg1 arg 2 arg3
(参数作为单一字符串输出)
-
"$@"
的行为:arg1
arg 2
arg3
(每个参数保持独立性)
4 应用场景
-
使用
"$@"
传递参数
如果需要保留参数的完整性,通常在脚本中通过"$@"
将参数传递给其他命令或函数:some_command "$@"
-
处理参数拼接时使用
"$*"
当需要将所有参数作为一个字符串传递时,可以使用"$*"
:echo "All arguments: $*"
五、小结
形式 | 描述 | 主要行为 |
---|---|---|
$* | 所有参数,未加引号 | 按空格分割参数展开为字符串 |
$@ | 所有参数,未加引号 | 与 $* 一致 |
"$*" | 所有参数,作为单个字符串 | 合并所有参数,参数间用空格分隔 |
"$@" | 所有参数,分别独立处理 | 每个参数独立加引号,保留参数完整性 |
推荐实践: 在处理位置参数时,优先使用 "$@"
,以避免因参数分隔导致的潜在错误。