csh -vx 用来显示输入的原样和变量替换后的脚本,用来帮助调试。
变量
- 通过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
变量修饰符
: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
数组
- 定义数组myarr, 通过$myarr[index]来访问数组中的值,注意index是从1开始的。
- 通过$myarr或$myarr[*]来访问数组所有的元素。
- 通过$#myarr来查看元素的个数。
set myarr = (str1, str2, str3)
echo $myarr[2] # echo $myarr echo $myarr[*]
命令替换
通过set x = `cmd`来执行命令,且结果赋值给变量。
set d = `date`
echo $d # echo $d[6]-$d[2]-$d[3]
命令行参数
- 通过$argv[1],$argv[2]或$1,$2来访问命令行参数。
- 命令行参数的个数为$#argv。
命令方式
cmd1 && cmd2
- 逻辑与关系,执行cmd1(如果cmd1 执行成功)后再执行cmd2。
- 这是一种短路操作,如果cmd1 没有成功执行,cmd2 将永远不能执行。
cmd1 || cmd2
- 逻辑或关系,执行cmd1 或(如果cmd1 执行失败)cmd2;
- 这是一个短路操作,如果cmd1 执行成功,cmd2 将永远不能执行。
控制流
(1) label 和 goto
goto label
......
label:
....
(2)if/else/switch/case
if(xxx) then
commands
endif
if(xxx) then
commands
else if(xxx) then
commands
else
commands
endi
switch("$value")
case pattern1: commands1 breaksw
case pattern2: commands2 breaksw
default: commands breaksw
endsw
while(xxx)
commands
continue
break
end
foreach var (wordlist)
commands
end
repeat 3 "echo helloworld"
break: 继续执行距离while 或foreach 最近的、在end 命令后的命令。
breaksw : 终止一个switch 语句,然后继续执行endsw 之后的命令。
eval args
一般地,eval用于shell 脚本中,并且args 是一行包含了shell 变量的代码。eval首先强制变量扩展,然后运行生成的命令。
当shell 变量包含了输入/ 输出重定向符号、别名或其他shell 变量的时候,这种两次搜索是有用的。(例如,正常情况下重定向发生在变量扩展之前,因此一个包含了重定向符号的变量必须首先用eval扩展,否则会无法解释那个重定向符号。
set b=,$a,
set a=hello
echo $b 读命令行一次
$a
eval echo $b 读命令行两次
hello
文件操作
-操作符 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