case语句的fall through

当然我说的是SHELL,不是其它的编程语言。 在看<学习KSH》中看到,把’;&’字串放在case语句中,会让case语句“fall through”(暂时没想到如何翻译,看下面的脚本输出来看看fall through是怎么回事)。实际 测试了一下发现,OpenBSD (5.8)以及DragonFly BSD (4.2)中的KSH不支持这个功能。因为他们的KSH所谓的pdksh衍生版(public domain korn shell),而Ubuntu (15.04)中通过apt-get安装的ksh是原始的Korn Shell,支持’;&’的fall through功能。 BASH shell则是从4.0版以后开始支持。 脚本:

Ubuntu:

DragonFly BSD (4.2):

   

Read More

GETOPTS中的OPTIND

最近对shell中的OPTIND变量有些糊涂,想要查看文档弄清楚。可惜无论KSH还是BASH的手册中对这个变量都只是提了一下定义:OPTIND是一个索引,用于指向调用getopts函数时需要处理的参数,它的初始值为1。并没有展开论述,也没有范例。 如果只看这个定义的话,倒也很清楚。不过实际一测试,反而容易糊涂,尤其是碰到需要值(argument)的参数。请看下面一个简单的示例脚本: 在Linuxmint/ubuntu上:

这里我们的脚本可以处理3个参数,a, b和c,其中c参数需要跟一个值。实际运行结果如下:

调用getopts之前,OPTIND的值为初始值1,getopts被调用后返回第一个参数a,同时OPTIND变为2,因此第二次调用getopts时返回第二个参数b,同时OPTIND变为3。同理,第三次调用getopts时返回第三个参数c,同时OPTIND变为5,因为值xd也同样算一个数的。第四次调用getopts时,由于不存在第五个参数,getopts返回-1,while循环结束。 看起来很清楚,没什么好糊涂的。 下面我们再看一下把参数合并后脚本运行的结果:

这个时候由于abc混在一块,从形式看都是第一个参数,因此OPTIND一直为1也可以理解。但是不知道shell的内部是如何区分这几个参数的呢? 但在OpenBSD上(估计其他BSD也一样),结果就有点差别了(参数分开的情况下结果是相同的):

但合并的时候就不同了:

不知为何。

Read More