TCSH环境下while循环无法检测空数组问题咨询
问题原因说明
这个现象是csh/tcsh 的语法解析特性+写法不规范共同导致的,不是你的shell环境有问题。
核心问题点
- csh/tcsh 中获取数组长度的标准语法是
$#数组名,你在while条件中写的${#arrname}加了额外大括号,部分版本的tcsh对这种写法的解析存在逻辑偏差,导致${#arrname} > 0的判断失效,数组长度为0时依然进入了循环体。 - 你的原始代码执行顺序验证:当数组长度为1时进入循环,执行完
shift arrname后数组长度变为0,下一轮循环时错误通过了${#arrname} > 0的判断,进入循环后访问$arrname[1]就触发了下标越界错误。
修复方案
直接将while条件的大括号去掉,使用标准语法即可,无需额外在循环内加break判断:
#!/usr/bin/env csh ls -l `which csh` echo $SHELL ls -l $SHELL set arrname=(x nx y ny z nz) # 去掉大括号,使用标准的数组长度获取语法 while ( $#arrname > 0 ) echo $#arrname echo "Full: >$arrname<" echo $arrname[1] shift arrname end echo "Hello"
修改后循环会在数组长度变为0时直接终止,不会进入最后一轮无效循环,也不会触发下标越界错误。
内容的提问来源于stack exchange,提问作者Michel Rogers-Vallee
相关产品推荐
相关产品推荐

