加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

[CSHELL]csh基本语法

(2022-03-30 18:38:11)
标签:

it

电脑技术

分类: 系统运维
在*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"
  

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有