我注意到CSH中有一些奇怪的$#行为。例如
set a=(Hello world); echo $#a
将按预期输出2。 为什么$#对环境变量的组合采取不同的行动?
echo $#PATH
实际上会输出PATH忽略#我希望它输出1.
我的猜测是,这只是CSH怪癖中的一个。关于此,手册页中没有任何内容。有人可以解释这种行为吗? (请不要打扰写“不要使用CSH”评论我不会使用它,如果我不需要)
答案 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
变量。