【shell】Cshell

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)

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]

命令行参数

  • 通过$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


#################################################

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                   将分隔的单词引起来。

 

你可能感兴趣的:(shell)