Bash $#和${#@}之间的差异

Bash $#和${#@}之间的差异,bash,string-length,Bash,String Length,我查看了以下代码,发现$#和${#@}打印的值相同。有人能告诉我这两者的区别吗 # length.sh E_NO_ARGS=65 if [ $# -eq 0 ] # Must have command-line args to demo script. then echo "Please invoke this script with one or more command-line arguments." exit $E_NO_ARGS fi var01=abcdEFGH2

我查看了以下代码,发现$#和${#@}打印的值相同。有人能告诉我这两者的区别吗

# length.sh

E_NO_ARGS=65

if [ $# -eq 0 ]  # Must have command-line args to demo script.
then
  echo "Please invoke this script with one or more command-line arguments."
  exit $E_NO_ARGS
fi  

var01=abcdEFGH28ij
echo "var01 = ${var01}"
echo "Length of var01 = ${#var01}"
# Now, let's try embedding a space.
var02="abcd EFGH28ij"
echo "var02 = ${var02}"
echo "Length of var02 = ${#var02}"

echo "Number of command-line arguments passed to script = ${#@}"
echo "Number of command-line arguments passed to script = $#"

exit 0
每本手册页():

${#参数}

参数长度。替换参数值的字符长度。如果参数为
*
@
,则替换的值为位置参数的数量。如果参数是*或@下标的数组名,则替换的值是数组中的元素数


因此,
${#@}
只是一个特例,因为
$#
是表示位置参数数量的常用方法。

实际上,我认为没有区别
$$
是命令行参数的数量,
$@
实际上是命令行参数的数组,
${}
是这个数组的长度——它们应该具有相同的值。请注意,
${{}
扩展到位置参数的数量这一事实是一种巴什主义。POSIX标准未定义
${#@}
${#*}