csh -vx 用来显示输入的原样和变量替换后的脚本,用来帮助调试。
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
set myarr = (str1 str2 str3)
unset myarr[1] #删除str1
unset myarr #删除整个数组
echo $myarr[2] # echo $myarr echo $myarr[*]
set ttt = (`eval 'find ./testdata -type d -name "$myarr[1]*"'`) #find的返回值是数组的元素
表达式用于在@(C shell 数学运算符)、if 和while 语句中执行算术运算、字符串
比较、文件测试等。exit和set 也能指定表达式。
运算符描述 描述
= 赋值
+= -= 在加/ 减后重新赋值
*= /= %= 在乘/ 除/ 求余后重新赋值
&= ^= |= 在对位进行AND/XOR/OR 后重新赋值
++ 递增
-- 递减
* / % 乘;整除;求余
+ - 加;减
~ 二进制求反(二进制反码)
! 逻辑非
<< >> 位左移;位右移
& 按位与
^ 按位异或
| 按位或
&& 逻辑与(短路操作)
|| 逻辑或(短路操作)
{command} 如果命令成功,则返回1;否则返回0。注意,这个情况和command 的
正常返回码是不一样的。$status 变量可能更实用一些
== != 相等;不等
<= >= 小于或等于;大于或等于
< > 小于;大于
=~ 左边字符串匹配一个包含*、?或[...]的文件名模式
!~ 左边字符串不匹配一个包括*、?或[...]的文件模式
@ x = ($n > 10 || $n < 5) #对变量$x赋值,注意@和x之间有空格
@ x = ($n >= 0 && $n < 3)
@ cnt = $cnt + 1 #$cnt 自增1
如下写法不可行
while($seed_num == $round_cnt * 10)
echo "ha"
end
应改为
set temp = 0;
@ temp = $round_cnt*10;
while($seed_num == $temp)
echo "ha"
end
命令替换
通过set x = `cmd`来执行命令,且结果赋值给变量。
set d = `date`
echo $d # echo $d[6]-$d[2]-$d[3]
命令行参数
命令方式
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用于shell 脚本中,并且args 是一行包含了shell 变量的代码。eval首先强制变量扩展,然后运行生成的命令。
当shell 变量包含了输入/ 输出重定向符号、别名或其他shell 变量的时候,这种两次搜索是有用的。(例如,正常情况下重定向发生在变量扩展之前,因此一个包含了重定向符号的变量必须首先用eval扩展,否则会无法解释那个重定向符号。
set b='$a'
set a=hello
echo $b 读命令行一次
$a
eval echo $b 读命令行两次
hello
#################################################
set pwa_name = dut_`date -d "1 day ago" +%m%d`
set job_name = `eval 'grep -E -o "JOB\.${pwa_name}.*[0-9]{6} " ./a.log'`
eval 'find ./ -type d -name "$testcase_arr[$loop_cnt]*" | head -n 10 | xargs -i cp -rf {} ./testdata/'
eval 'find ./ -type d -name "$testcase_arr[$loop_cnt]*" -exec cp -rf {} ./testdata/ \;'
-操作符 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
if ($file !~ *.[zZ]) 如果文件不是以.z或.Z为结尾⋯⋯
if ($argv[1] =~ chap?) 如果第一个参数是chap 后跟着一个单字符⋯⋯
! 开始一个历史替代
!! 先前命令
!N 历史表中第N 条命令
!-N 从当前命令开始往后第N 条命令
!string 以string 开始的最近的命令
!?string? 包含了string 的最近的命令
!?string?% 包含了string 的最近命令参数
!$ 先前命令的最后一个参数
!!string 上一条命令,然后追加string
!N string 第N 条命令,然后追加string
!{s1}s2 以字符串s1 开始的最近的命令,然后追加字符串s2
^old^new^ 快速替代,在先前命令中将字符串old 改成new,执行修改后的命令
历史修饰符
可以通过一个或多个修饰符来修饰命令替代和单词替代:
输出、替代和引用
:p 只显示命令但不执行。
:s/old/new 用字符串new 替代old,只影响第一个实例。
:gs/old/new 用字符串new 替代old,适用于所有的实例。
:& 重复先前的替代(:s 或^ 命令),只影响第一个实例。
:g& 重复先前的替代,适用于所有实例。
:q 将一个单词列表引起来。
:x 将分隔的单词引起来。