Shell中 $* 和 $@ 的区别

在 shell 中,$*$@ 都表示命令行参数列表(即传递给脚本或函数的参数列表),但它们在展开时有一些微妙的区别。

$* 展开为所有位置参数列表,由一个单一的字符串表示,参数之间由第一个位置参数中的第一个字符分隔符(IFS 环境变量指定的字符,通常是空格)分隔。例如,如果在命令行上调用脚本 myscript.sh,并传递三个参数 "foo"、"bar" 和 "baz",则 "$*" 会展开为一个字符串 "foo bar baz"。

$@ 展开为所有位置参数列表,由多个独立的字符串表示,每个字符串对应一个位置参数。这些字符串不包含分隔符,可以用双引号括起来以保留空格等特殊字符。例如,如果在命令行上调用脚本 myscript.sh,并传递三个参数 "foo"、"bar" 和 "baz",则 "$@" 会展开为三个字符串 "foo"、"bar" 和 "baz"。

在大多数情况下,"$@" 更常用,因为它允许您保留参数中的空格和特殊字符,并将它们作为单独的参数传递给命令或函数。例如,下面的脚本会将传递给它的参数打印出来:

#!/bin/bash

for arg in "$@"
do
  echo "$arg"
done

 

如果您将上述脚本保存为 myscript.sh,并在命令行上执行以下命令:

$ ./myscript.sh "hello world" foo bar

 

则输出将是:

hello world
foo
bar

 

如果您使用 $* 替换 $@,则会将所有参数作为单个字符串传递给 for 循环,并且将空格视为参数之间的分隔符,因此输出将是:

hello world foo bar

 

posted @ 2023-02-22 21:36  南哈哈  阅读(587)  评论(0)    收藏  举报