Csh的基本语法介绍
在*unix系统中,常⽤的shell有sh,bash,csh/tcsh, ksh.
sh来⾃于systemV的Unix,是传统的Unix的shell,直到现在很多的系统管理员仍然喜欢使⽤sh。
bash来⾃于BSD Unix,语法⾮常类似于C语⾔,所以通常有C/C++编程背景的开发⼈员最喜欢使⽤。
ksh是对sh的扩展,且吸收了csh的⼀些有⽤的功能,但是由于开始ksh的license是AT&T,所以后来出现了很多的ksh的开源版本,例如mksh,pdksh等。
bash是现在很多Linux的发⾏版中默认的shell,综合了其他shell的很多优点。
下⾯描述csh的⼀些基本的语法(在sh环境中执⾏csh切换到csh环境):
1) 变量
通过set来定义局部变量x,通过$x或${x}来使⽤变量x的值,$%x表⽰变量的值的长度, $?x来判断变量x是否设置,如设置则为1,否则为0。
复制代码 代码如下:
set x = 5
echo $x
echo ${x}kg
echo $%x
全局变量的定义setenv v  value 该变量将被此shell派⽣的所有⼦shell继承。
$$表⽰当前进程的PID, $status 或 $? 表⽰退出状态。
2)数组
定义数组myarr, 通过$myarr[index]来访问数组中的值,注意index是从1开始的。通过$myarr或$myarr[*]来访问数组所有的元素。通过$#myarr来查看元素的个数。
复制代码 代码如下:
set myarr = (str1, str2,str3)
echo $myarr[2]
echo $myarr
echo $myarr[*]
3)命令替换
通过set x = `cmd`来执⾏命令,且结果赋值给变量。
复制代码 代码如下:
set d = `date`
echo $d
echo $d[6]-$d[2]-$d[3]
4)命令⾏参数
通过$argv[1],$argv[2]或$1,$2来访问命令⾏参数。命令⾏参数的个数为$#argv。
5)⽂件名扩展的元字符
只能使⽤?,*,[abc],[a-c]。
6)IO重定向和管道
将命令的输出重定向到⽂件为>。
将命令的输出重定向并追加到⽂件为>>。
将命令的输⼊重定向到⽂件为<。
将命令的报错信息重定向到⼀个⽂件(cmd>/dev/tty)>&errors。
将命令的输出和错误输出分别重定向(cmd > goodstuff)  >& badstuff。
将命令的输出和报错信息重定向到⼀个⽂件cmd>&file。
将命令的输出经管道发往另⼀个命令cmd|cmd.
将命令的输出和报错信息经管道发往另⼀个命令cmd|&cmd。
条件语句为 cmd && cmd 或 cmd || cmd。
command<<WORD 表⽰将command的输⼊重定向为从第⼀个WORD处开始,到下⼀个WORD处之间的内容(即here⽂档)。7)从键盘读取并保存到变量中
复制代码 代码如下:
set var = $<
8)算术
复制代码 代码如下:
@ var = 5 + 5
echo $var
@ v2 = $var + 3
echo $v2
9)代字符号扩展
~username 表⽰username的home⽬录。
10)别名
alias m more 为more创建别名m。
alias 列出所有的alias。
unalias m ⽤来删除more的alias定义。
11)初始化⽂件
.login 在登录时执⾏的⽂件。
.cshrc 在每次调⽤shell时都执⾏的⽂件。
12) label 和 goto
csh中没有函数的概念,使⽤类似windows批处理中的label和goto。
复制代码 代码如下:
goto label
.
.....
label:
....
13) if/else/switch/case
复制代码 代码如下:
if(expression)then
commands
endif
if {(command)} then
commands
endif
if(expression) then
commands
else if(expression) then
commands
else
commands
endif
switch("$value")
case pattern1:
commands
breaksw
case pattern2:
commands
breaksw
default:
commands
breaksw
endsw
14 while/foreach
复制代码 代码如下:
while(expression)
commands
continue
break
end
foreach var (wordlist)
commands
end
15、repeat
repeat表⽰重复执⾏后⾯的命令。
复制代码 代码如下:
repeat 3 "echo helloworld"
16、csh中设置环境变量PATH的⽅法
csh中使⽤path代替PATH,设置类似于数组的使⽤。复制代码 代码如下:
set path = ($path /home)
echo $path
echo $PATH
17、source等价于其他shell中的.
source使得程序在当前的shell中被执⾏,⽽不是派⽣⼦进程来执⾏。
18、转义字符与单双引号
引号必须成对出现,⽽且必须在同⼀⾏上配对。可以⽤反斜杠来转义换⾏符,这样就能在下⼀⾏配对了。
单引号可⽤于保护双引号,双引号也可以⽤来保护单引号。
单引号保护除历史字符(!)之外的所有元字符不被解释。
双引号保护除历史字符(!),变量替换字符($)和反引号(⽤于命令替换)之外的所有元字符,使其不被解释。
19、历史command
history⽤来查看command执⾏的历史。
!!⽤来执⾏上⼀条命令。
20、pushd和popd⽤来维护⽬录栈
21、csh -vx⽤来显⽰输⼊的原样和变量替换后的脚本,⽤来帮助调试。
22、在脚本中处理中断
复制代码 代码如下:
onintr finish
<script continues here>
finish:
onintr - # Disable further interrupts
echo Cleaning temp files
exit 1
onintr 命令后跟⼀个标号名,finish是⽤户⾃定义的标号。如果发⽣中断,控制将被转移到finish标号。通常该⾏位于脚本的开头。除⾮当程序正在执⾏时按ctrl+C(中断键),此时控制将被转移到该标号。onintr - 表⽰屏蔽所有的中断,此时按下ctrl+C将会被忽略。
shell代码
23、noclobber 禁⽌覆盖变量,设定 $noclobber 预设变量改变输出重定向特性.
变量设定语法 set noclobber
取消变量设定语法 unset noclobber
这个 noclobber 变量,它的功能便是停⽌重定向符号“>”的覆盖(overwiting)已存在⽂件以及符号“>>”要将字符写⼊⼀个不存在的⽂件时,⾃动产⽣该⽂件的特性。
仅⽤两个例⼦让读者明⽩,设定后的实际使⽤状况。
例⼦⼀:
复制代码 代码如下:
% ps axu > testfile
% set noclobber
% echo "test set noclobber" > testfile
testfile: File exists.
% echo "test set noclobber" >! testfile
%
例⼦⼆:
复制代码 代码如下:
% set noclobber
% cat /etc/passwd >> nopass nopass: No such file or directory % cat /etc/passwd >>! nopass
%

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。