CShell Script從入門到精通
如何将命令行的参数传给script呢? 可以这样: 键入script名, 后面跟任何你想要传递的参数. Cshell把script名后面的字符按照词(words)来划分后传递给一个叫做argv的变量数组, 叫做arguments list. 这样命令行的参数就作为words存储于argv中, 连同script名, 分别可以被引用为argv[0], argv[1], ... argv[n], 或者你也可以用等效的方法即$0,$1,...,$n来引用它们,其中n是参数的个数.
一、Cshell基本语法
1) 变量
通过set来定义局部变量x,通过$x(或${x})来使用变量x的值,$%x表示变量的值的长度, $?x来判断变量x是否设置,如设置则为1,否则为0。
set x = 5
echo ${x} # echo ${x}, echo $%x
全局变量(也叫系統變量)的定义setenv v value 该变量将被此shell派生的所有子shell继承。下面的例子展示了設定系統變量和解除系統變量。
unsetenv MINUS_SRC_USER
setenv MINUS_SRC_USER dv01055
$$表示当前进程的PID,
$status 或 $? 表示退出状态。
2)数组
定义数组myarr, 通过$myarr[index]来访问数组中的值,注意index是从1开始的。通过$myarr或$myarr[*]来访问数组所有的元素。通过$#myarr来查看元素的个数。
set myarr = (str1 str2 str3) ##初始化數組,各個Value之間用空格隔開
echo $myarr[2] # echo $myarr echo $myarr[*]
foreach obj ($myarr)
echo $obj
end
set array = (2 3 4 5 6)
set cnt = 4
foreach obj ($array)
if($obj >= $cnt) then
echo "check pass!"
else
echo "check fail!"
endif
end
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 = $< </span>
set d = `data`
8)Cshell算术运算
@ 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(xxx) then
commands
endif
if(xxx) then
commands
else if(xxx) then
commands
else
commands
endif
switch("$value")
case pattern1:
commands1
breaksw
case pattern2:
commands2
breaksw
default:
commands
breaksw
endsw
14 while/foreach
while(xxx)
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用来显示输入的原样和变量替换后的脚本,用来帮助调试(csh 調試)。
22、在脚本中处理中断
onintr finish
finish:
onintr - # Disable further interrupts
echo Cleaning temp files
exit 1
onintr 命令后跟一个标号名,finish是用户自定义的标号。如果发生中断,控制将被转移到finish标号。通常该行位于脚本的开头。除非当程序正在执行时按ctrl+C(中断键),此时控制将被转移到该标号。onintr - 表示屏蔽所有的中断,此时按下ctrl+C将会被忽略。
23、noclobber 禁止覆盖变量,设定 $noclobber 预设变量改变输出重定向特性.
变量设定语法set noclobber
取消变量设定语法unset noclobber
这个 noclobber 变量,它的功能便是停止重定向符号“>”的覆盖(overwiting)已存在文件以及符号“>>”要将字符写入一个不存在的文件时,自动产生该文件的特性。
24、文件操作格式
-操作符 filename
-e 文件存在返回1(.true.), 否则返回0(.false.).
-r 文件可读返回1,否则返回0.
-w ....可写................
-x ....可执行...............
-o 文件属于用户本人返回1, 否则返回0.
-z 文件长度为0返回1, 否则返回0.
-f 文件为普通(plain)文件返回1, 否则返回0.
-d 文件为目录文件时返回1, 否则返回0
25、路径名操作
你可以对路径名进行操作, 以便于去掉你不需要的部分.
:t (tail)只保留路径名最右边的部分, 而将前面的全部去掉. (相当于basename)
:r (root)去掉从"."(dot)开始的后缀部分.
:e (end)去掉从左边开始一直的"."的前缀部分.
:h (head)去掉最后的一部分, 只保留文件所在的目录名.
26、变量修饰符
:r 返回变量的根。
:e 返回变量的扩展。
:h 返回变量的头。
:t 返回变量的尾。
:gr 返回所有的根。
:ge 返回所有的扩展。
:gh 返回所有的头。
:gt 返回所有的尾。
:q 将一个单词列表变量引起来,将其各部分分隔开。当变量中包含不应进行扩展的文件名元字符时,该选项比较有用。
:x 将一个模式引起来,并将它扩展成单词列表。
set aa=(/progs/num.c /book/chap.ps)
变量部分 格式 输出结果
正常变量 echo $aa /progs/num.c /book/chap.ps
第二个根 echo $aa[2]:r /book/chap
第二个头 echo $aa[2]:h /book
第二个尾 echo $aa[2]:t chap.ps
第二个扩展 echo $aa[2]:e ps
根 echo $aa:r /progs/num /book/chap.ps
全部根 echo $aa:gr /progs/num /book/chap
头 echo $aa:h /progs /book/chap.ps
全部头 echo $aa:gh /progs /book
尾 echo $aa:t num.c /book/chap.ps
全部尾 echo $aa:gt num.c chap.ps
扩展 echo $aa:e c /book/chap.ps
全部扩展 echo $aa:ge c ps
27、打印系統時間
%H 小时(以00-23来表示)。
%I 小时(以01-12来表示)。
%K 小时(以0-23来表示)。
%l 小时(以0-12来表示)。
%M 分钟(以00-59来表示)。
%P AM或PM。
%r 时间(含时分秒,小时以12小时AM/PM来表示)。
%s 总秒数。起算时间为1970-01-01 00:00:00 UTC。
%S 秒(以本地的惯用法来表示)。
%T 时间(含时分秒,小时以24小时制来表示)。
%X 时间(以本地的惯用法来表示)。
%Z 市区。
%a 星期的缩写。
%A 星期的完整名称。
%b 月份英文名的缩写。
%B 月份的完整英文名称。
%c 日期与时间。只输入date指令也会显示同样的结果。
%d 日期(以01-31来表示)。
%D 日期(含年月日)。
%j 该年中的第几天。
%m 月份(以01-12来表示)。
%U 该年中的周数。
%w 该周的天数,0代表周日,1代表周一,异词类推。
%x 日期(以本地的惯用法来表示)。
%y 年份(以00-99来表示)。
%Y 年份(以四位数来表示)。
%n 在显示时,插入新的一行。
%t 在显示时,插入tab。
MM 月份(必要)
DD 日期(必要)
hh 小时(必要)
mm 分钟(必要)
ss 秒(选择性)
二、CShell應用實例
(1)Cshell提取字符串中的数字保存到变量中
temp=`echo "helloworld20180719" | tr -cd "[0-9]" `
echo $temp
#输出 20180719
(2)Cshell提取字符串中的数字重定向到文件
echo "helloworld20180719" | tr -cd "[0-9]" > mid.txt
cat mid.txt
#输出20180719
在上面的代碼中:
>表示 重定向输出到文件,如果文件不存在,会自动创建,如果文件存在,会清空文件。
>>表示追加输出到文件,同样,文件不存在就好创建,文件存在的话会追加新的内容到文件的末尾,原有内容不会影响到。
我们写脚本时经常会使用到>>将标准错误输出及信息重定向到日志文件中。
2>&1表示把 标准错误输出 重定向到 标准输出
&>file 意思是把 标准输出 和 标准错误输出 都重定向到文件file中
解释一下 | tr -cd "[0-9]"
| 其实就是管道描述符,将上个指令的标准输出。作为下个指令的标准输入
如echo "helloworld20180719" | tr -cd "[0-9]"
意思就是将"helloworld20180719"这句话作为 tr -cd "[0-9]"的输入
tr其实是translate的缩写,主要用于删除文件中的控制字符,或进行字符转换
-d表示删除,[0-9]表示所有数字,-c表示对条件取反
所以tr cd "[0-9]"这句话的意思就是,剔除非数字的字符。
即输出20180719