CSH中的$#行为

时间:2015-10-10 20:38:32

标签: shell unix csh

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

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

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

echo $#PATH

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

我的猜测是,这只是CSH怪癖中的一个。关于此,手册页中没有任何内容。有人可以解释这种行为吗? (请不要打扰写“不要使用CSH”评论我不会使用它,如果我不需要)

2 个答案:

答案 0 :(得分:1)

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

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

对于$#FOO$FOO是一个环境变量,它可能更加一致,以产生1而不是扩展到$FOO的值。在任何情况下,行为似乎都没有记录,你应该避免依赖它。

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

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

答案 1 :(得分:0)

环境变量不能是一个列表,只有变量可以,所以做$#PATH会让小事变得有意义。它应该是一个错误。

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