Shell 中 `$*`、`$@`、`“$*“` 和 `“$@“` 的区别

Shell 中 $*$@"$*""$@" 的区别

在 Shell 脚本编程中,参数传递是常见操作,其中 $*$@"$*""$@" 是处理位置参数的重要工具。虽然它们看似相似,但实际行为却有明显差异。理解它们的区别对于编写高效的脚本至关重要。


1 基本定义

  • $*$@
    它们用于表示脚本接收到的所有位置参数:

    • $* 将所有参数视为一个整体。
    • $@ 将所有参数视为独立的个体。
  • 加引号的版本:"$*""$@"
    当这些变量被双引号包裹时,其行为会发生变化:

    • "$*" 将所有参数作为一个单独的字符串。
    • "$@" 保留参数的独立性,每个参数仍然是独立的字符串。

2 具体区别

  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
  1. $* 的行为:

    • arg1
    • arg
    • 2
    • arg3
      (参数被拆分)
  2. $@ 的行为:

    • $* 一致。
    • 输出相同。
  3. "$*" 的行为:

    • arg1 arg 2 arg3
      (参数作为单一字符串输出)
  4. "$@" 的行为:

    • arg1
    • arg 2
    • arg3
      (每个参数保持独立性)

4 应用场景

  1. 使用 "$@" 传递参数
    如果需要保留参数的完整性,通常在脚本中通过 "$@" 将参数传递给其他命令或函数:

    some_command "$@"
    
  2. 处理参数拼接时使用 "$*"
    当需要将所有参数作为一个字符串传递时,可以使用 "$*"

    echo "All arguments: $*"
    

五、小结

形式描述主要行为
$*所有参数,未加引号按空格分割参数展开为字符串
$@所有参数,未加引号$* 一致
"$*"所有参数,作为单个字符串合并所有参数,参数间用空格分隔
"$@"所有参数,分别独立处理每个参数独立加引号,保留参数完整性

推荐实践: 在处理位置参数时,优先使用 "$@",以避免因参数分隔导致的潜在错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值