CSH 中的 $# 行为

$# behaviour in CSH

我注意到 CSH 中 $# 的一些奇怪行为。例如

set a=(Hello world); echo $#a

将按预期输出 2。 为什么 $# 与环境变量组合的行为不同?

echo $#PATH

实际上会输出 PATH 忽略 # 我希望它输出 1。

我猜这只是 CSH 怪癖之一。手册页中没有关于此的内容。有人可以解释这种行为吗? (请不要费心写 "don't use CSH" 评论,如果不需要,我不会使用它)

环境变量不能是列表,只有变量可以,所以 $#PATH 没有意义。应该是报错了。

如果想获取路径的长度,可以使用$#path。这将使用特殊的 $path 变量。

$#foo,其中 $foo 是一个 shell 数组变量,生成数组 $foo 中的元素数。如果 $foo 是一个普通的非数组变量,$#foo 产生 1.

csh 和 tcsh 对待 shell 变量(由 set 命令设置)与环境变量(由 setenv 命令设置或从父进程继承)完全不同。环境变量的值始终只是一个字符串(这就是为什么 $PATH,例如,需要 : 个字符来分隔列表元素)。

$#FOO 可能更一致,其中 $FOO 是一个环境变量,产生 1 而不是扩展到 $FOO 的值。无论如何,该行为似乎没有记录在案,您应该避免依赖它。

如果您特别想要路径中的目录数,$#path 会为您提供; $path 是一个 shell 数组变量,自动绑定到 $PATH 环境变量的值。

对于其他变量,您只需跟踪变量是 shell 变量还是环境变量。