新浪博客

[CSHELL]csh基本语法

2022-03-30 18:38阅读:
在*unix系统中,常用的shell有sh,bash,csh/tcsh, ksh;
sh 来自于systemV的Unix,是传统的Unix的shell,直到现在很多的系统管理员仍然喜欢使用sh。
csh 来自于BSD Unix,语法非常类似于C语言,所以通常有C/C++编程背景的开发人员最喜欢使用。
ksh 是对sh的扩展,并吸收了csh的一些功能,后来有很多 ksh 的开源版本,例如mksh,pdksh等。
bash 是现在很多Linux的发行版中默认的shell,综合了其他shell的很多优点。
下面描述csh的一些基本的语法(在sh环境中执行csh切换到csh环境):
01) 变量
set x = 5 #定义变量并赋值
echo $x #引用变量
echo ${x}kg #引用变量
echo $%x #变量值的长度
echo $?x #判断变量x是否设置,如设置则为1,否则为0
setenv v value #全局变量,能被此shell派生的所有子shell继承
$$ #表示当前进程的PID
$home #和Bourne Shell的$HOME相同
$path
#和Bourne Shell的$PATH相似,只不过这是一个阵列
$prompt #和Bourne Shell的$PS1相同
$shell #Shell的路径名称
$status #和Bourne Shell的$?相同,命令执行后的返回值
csh无变量裁剪功能,可借助cut、sed、awk等实现
02)数组(或称阵列)
set myarr = (str1,str2,str3) #定义数组
echo $myarr[2] #访问数组中的值,index从1开始
echo $myarr #访问数组所有元素
echo $myarr[*] #访问数组所有元素
echo $#myarr #查看元素的个数
03)命令替换
set d = `date` #执行命令,将结果赋值给变量
echo $d
echo $d[6]-$d[2]-$d[3]
04)命令行参数
$argv[1], $argv[2] #访问命令行参数,不受个数限制
$1, $2 #访问命令行参数
$#argv #与bash中的 $#相同,命令行参数的个数
$argv #与bash中的 $*相似,只不过这是一个阵列。
shift #参数左移
05)文件名扩展的元字符
只能使用?, *, [abc], [a-c]
06)IO重定向和管道
> #将命令的输出重定向到文件
>> #将命令的输出重定向并追加到文件
< #将命令的输入重定向到文件
(cmd>/dev/tty)>&errors #将命令的报错信息重定向到一个文件
(cmd > goodstuff) >& badstuff #将命令的输出和错误输出分别重定向
cmd>&file #将命令的输出和报错信息重定向到一个文件
cmd|cmd #将命令的输出经管道发往另一个命令
cmd|&cmd #将命令的输出和报错信息经管道发往另一个命令
cmd && cmd #条件语句,前面正常则执行后面语句
cmd || cmd #条件语句,前面异常则执行后面语句
command<<WORD # command的输入从第一个WORD开始,到下一个WORD之间
07)从键盘读取并保存到变量中
set var = $<<br>
08)算术
@ var = 5 + 5 #加减乘除
@ v2 = $var + 3
09)代字符号扩展
~ #当前用户的home目录
~username #username的home目录
10)别名
alias m more #为more创建别名m
alias #列出所有的alias
unalias m #用来删除more的alias定义
Csh没有提供函数,可通过alias实现函数的功能
alias 参数处理: 第一个参数 !:1,最后一个参数 !$, 所有参数 !*
字符串中的 ! 是特殊字符(执行历史命令), 所以需要加上 \ 使用
11)初始化文件
.login 在登录时执行的文件
.cshrc 在每次调用shell时都执行的文件
#!/bin/csh -f #-f 参数可避免执行.cshrc
12) label 和 goto
csh中没有函数的概念,使用类似windows批处理中的label和goto。
goto label
......
label:
....
13) if/else/switch/case
if (表达式) then
commands
endif
if {(command)} then
commands
endif
if (表达式) then
commands
else if (表达式) then
commands
else
commands
endif

switch('$value')
case pattern1: # case 'str', *.c
commands
breaksw
default:
commands
breaksw
endsw
14) while/foreach
while(表达式)
commands
continue
break
end
foreach var (wordlist)
commands
end
15) repeat
repeat 3 'echo helloworld' #重复执行后面的命令
16) csh中设置环境变量PATH的方法
set path = ($path /home) #csh中使用path代替PATH,设置类似于数组的使用
echo $path
echo $PATH
17) source等价于其他shell中的 .
source #载入程序或设置,在当前的shell中被执行,而不是派生子进程
18) 转义字符与单双引号
引号必须成对出现,必须在同一行上配对;可用反斜杠转义换行符,实现下一行配对
单引号可用于保护双引号,双引号也可以用来保护单引号。
单引号保护除历史字符(!)之外的所有元字符不被解释。
双引号保护除历史字符(!)、变量替换字符($)和反引号(用于命令替换)之外的所有元字符,使其不被解释
19) 历史command
history #查看command执行的历史
!! #执行上一条命令。
20) pushd和popd用来维护目录栈
21) 帮助调试
csh -vx #显示输入的原样和变量替换后的脚本。

22) 在脚本中处理中断

onintr finish #命令后跟一个标号名
代码段 #待执行的代码段
finish: #发生中断时,将转移到finish标号,除非ctrl+C
onintr - #屏蔽所有中断,此时按下ctrl+C将会被忽略
echo Cleaning temp files
exit 1
23) noclobber 禁止覆盖变量
set noclobber #变量设定,停止重定向符号:>、>>
unset noclobber #取消变量设定
例子一:
% 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
%
24) expr命令:expr 表达式
条件表达式
比较运算: (a < b), 比较运算支持 '< <= == >= >', 适用于整数和字符串
字符串匹配: (a =~ *.c), 不匹配 !~
逻辑运算: && || ! (与或非),-a(与) -o(或) !(非),优先级:非>与>或
文件测试: ( -f/e/d file )
25) test命令:test 表达式
string #string不为空白字串
-n string #string的长度大於0
-z string #string的长度等於0
string1=string2 #string1等於string2
string1!=string2 #string1不等於string2
int1 -gt int2 #int1大於int2
int1 -ge int2 #int1大於等於int2
int1 -eq int2 #int1等於int2
int1 -ne int2 #int1不等於int2
int1 -le int2 #int1小於等於int2
int1 -lt int2 #int1小於int2
-r filename #档案可读取
-w filename #档案可写入
-x filename #档案可执行
-f filename #档案为一般档
-d filename #档案为目录
-s filename #档案为非空的一般档
示例:test -r '$filename' -a -s '$filename'

我的更多文章

下载客户端阅读体验更佳

APP专享