前言
相信在IC行业中不少公司使用cshell作为脚本语言之一,很不幸的是目前网络上cshell的中文介绍少之又少,绝大部分是bash的介绍。近期有幸阅读了一本cshell cookbook,故将个人的学习心得发布于此,也希望志同道合的朋友一起探讨一番。(从看cookbook到博文的发表历时4个月,每天下完班就瞌睡的很,icer sandman无疑了,当然也是创作不易呀)。
下面我将从cshell的变量,字符处理,文件处理和基本的语句结构进行介绍。本文假设读者对cshell脚本一无所知,sandman力求写一篇白菜教程。因此,仅仅需要读者了解如何跑cshell的脚本即可,即terminal中输入source xxxx.csh。现在知道也不迟的,详细仔细阅读这篇文章对于编写或者修改cshell脚本有较大的帮助。
shell selection(shell类型选择)
通常在cshell脚本的第一行,我们需要指明脚本的类型,这有助于UNIX系统去解析对应的脚本。换句话说,系统需要知道用户source的脚本是哪一种类型的,是perl,bash,cshell还是TCL(后续sandman会慢慢的更新,但是不知道何时有空更新,随缘吧)
#!/bin/csh #注释:正常情况下写这一条代码就可以了,因为bin目录下一般会存在csh。
有了前面的铺垫后,下面开始进入正题:
变量
cshell的变量可以分为标量,数组和特殊变量。
- 标量(scalar)
set是给标量赋值的关键字。cshell中没有字符串,整型,负数以及浮点型的区别,统一使用set为标量赋值,下面看几个例子。
set colour = blue
set title = "hello world"
set float_dat = 1.23E-09
set int_dat = 9
set int_dat_s = -9
由此可知,设置变量的范式如下所示。
set VAR_NAME = VALUE #VAR_NAME: 标量名称;VALUE:标量值
另外,在某些情况下可能需要移除某个标量,被移除的标量不能在后续的程序中使用。cshell脚本中使用unset便可实现。如移除colour。
set colour = blue
#标量参与了某件事情的处理
unset colour
#由于使用unset移除了colour,因此后续不能在使用 colour这个标量
值得注意的是:unset支持字符匹配的方式,表示匹配的标量都会被移除,如下所示。
unset iso_* #表示移除名称是以iso_为前缀的所有标量,如iso_a,iso_1, iso_1234等。
另外,可能还有setenv这个关键字,该关键字表示设置系统标量,即整个系统都可以看见。移除某个系统标量的关键字为unsetenv。那么两者的区别是什么呢?set和setenv两者的区别为:可见的范围不同。
- set定义的标量仅仅是当前脚本可见。
- setenv定义的变量是系统可见,可以用echo输出系统标量,即echo $SYS_VAR_NAME
个人建议少用系统标量,要用也应该避免和系统中以后的标量名重复。即,假设系统中有一个标量的名字为SYS,如果我们在编写xxx.csh脚本时,一步小心写setenv SYS = 1, 那么source xxx.csh后,原本的SYS将变成1,覆盖了之前的值,这可能是灾难性的后果。
这里介绍一个使用系统标量的实际案例。有些场景中需要在cshell中调用TCL,并且不是直接调用,中间可能还包了一层或者几层的其他脚本,如Makefile。然而,我们需要把cshell中的某个标量值传递给TCL,为了简单起见且修改最少的内容,我们可以把需要传递的标量定义为系统标量,这样在TCL中我们就可以直接使用。
setenv SWCH_ME = "ON" # 定义系统标量SWCH_ME
# 下面是TCL语句
set SWCH = $ENV{
SWCH_ME} #TCL中引用系统标量SWCH_ME
我想关于标量的描述有这些就够了。
- 数组(array)
数组可以简单的理解为多个标量组合。即通过括号将多个标量组合起来,并且使用空格作为分隔符。其中,一个数组里面可以包含不同类型的标量,如整型,浮点型,字符型等。另外如果数组中包含了带空格的字符串,那么一定需要使用双引号将字符串包起来,否则字符串会被解析器认为是数组中的多个元素。简单示例如下所示。
set coluors = (blue yellow green red pink)
set misc = ("hello world" blue 3 -4 1.34E09)
其中,hello world不采用“”包起来的话,那么解析器就会认为hello是数组misc的一个元素,world是数组的另一个元素。
数组的范式如下所示:
在这边插一个打印数组的方式,在debug期间经常会使用,当然后文会有较为详细的介绍。
echo "info coluors array: $coluors"
echo "info misc array: $misc"
set ARR_NAME = (ELEM1 ELEM2 ELEM3)
定义好数组后,更加关键的是如何使用。下面以一个实例详细的介绍数据的使用。
定义一个数组prime:
set prime = (1 2 3 4 5 6 7 8 9)
# $#prime的结果为9;
# $prime[*]的结果为:1 2 3 4 5 6 7 8 9;
# $prime[$]的结果为:9;
# $prime[3-5]的结果为:3 4 5;