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 变量还是环境变量。
我注意到 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 变量还是环境变量。