csh -vx 用来显示输入的原样和变量替换后的脚本,用来帮助调试。

变量

  • 通过set来定义局部变量x,通过$x(或${x})来使用变量x的值;
  • $%x  表示变量的值的长度
  • $?x   来判断变量x是否设置,如设置则为1,否则为0;
set x = 5echo ${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) thencommandsendif
if (xxx) thencommandselse if (xxx) thencommandselsecommandsendif
switch("$value")case pattern1: commands1  breakswcase pattern2: commands2  breakswdefault: commands  breakswendsw

while(xxx)commandscontinuebreakend

foreach var (wordlist)commandsend
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 读命令行一次
$aeval 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】Cshell相关推荐

  1. 【shell】常用语法 -b file -c file -f file-d file -x file

    [shell]常用语法 -b file  -c file  -f file-d file  -x file      一.test条件判断 1,test文件测试: -b file     若文件存在且 ...

  2. 【Shell】awk命令--输出某列,列求和,列求平均值,列最大值,列去重复,取倒列,过滤行,匹配,不匹配,内置变量|定义分隔符|多个分隔符...

    目录 awk基本语法 awk输出某几列 awk遍历文件行处理 awk中运行shell命令 方法1:awk 内置函数system 方法2 通过awk  print 交给bash awk中运行shell命 ...

  3. linux 脚本 $? -ne 0是什么意思,【shell】linux之if [ $? -ne 0 ];-ne 表示 不等于,参考shell中运算符整数比较

    $# 是启动脚本时携带的参数个数 -ne 是不等于 这个语句的意思是"如果shell的启动参数不等于1个" $# 表示提供到shell脚本或者函数的参数总数: $1 表示第一个参数 ...

  4. 【shell】笔记|去重复行|删除匹配行|反选删除|反向显示|加减乘除

    目录 配置 bash Shell忽略命令大小写 |按"上"键显示该命令的历史 shell 删除匹配行 shell 获取结果中的第n列,第n行 grep过滤 shell 注释块 Li ...

  5. linux 脚本 $? -ne 0是什么意思,【shell】linux之if [ $? -ne 0 ];

    [shell]linux之if [ $? -ne 0 ]; 1年前 (2019-11-19)    作者:Jiaozn    分类:Shell    阅读次数:868 评论(0) $# 是启动脚本时携 ...

  6. 【Shell】判断是否包含给定字符串

    目录 Shell判断字符串包含关系的几种方法 shell中[ ]和[[]]的区别 格式匹配 作者:bandaoyu  链接:https://blog.csdn.net/bandaoyu/article ...

  7. 【shell】shuf命令提取文件的随机行

    [shell]shuf命令提取文件的随机行 shuf命令可以随机提取一个文本文件的不同行,输出到文件或者标准输出中. shuf用法: shuf [选项]... [文件]或者: shuf -e [选项] ...

  8. 【shell】shell字符串分割|文件分割|剪切|截取

    目录 一.字符串分割 1.awk分割 2.利用shell 中 变量 的字符串替换成空格分割 3.设置分隔符,通过 IFS 变量 4.利用tr 指令实现字符替换 二.文件分割 按行切割 按时间切割(符合 ...

  9. 【shell】linux输出重定向|输出重定向2>1

    目录 即看即用 详细 知识铺垫 说明 [shell]输出重定向2>&1 即看即用 标准输出: ls thereisno 1> out.txt  标准输出重定向  也可以不加1写成 ...

最新文章

  1. 淘宝Tengine服务器开源
  2. 千万用户同时在线,优酷智能档在双11“猫晚”直播如何防卡顿?
  3. [2015-11-10]iis远程发布配置
  4. python将姓王的都改成老王_Python老王视频习题答案
  5. JS判断日期是否在同一个星期内,和同一个月内
  6. NB贝叶斯平凡而又神奇的贝叶斯方法
  7. 你应该知道的一些 ADB 命令
  8. 幼儿园学校网站JAVA_基于jsp的幼儿园网站-JavaEE实现幼儿园网站 - java项目源码
  9. 需求与商业模式分析-1-商业模式画布
  10. android变化HOLO对话风格
  11. 正态总体均值假设检验
  12. 百度地图的一些踩坑 marker网络图片不显示
  13. 41岁职场中年人深度劝告:一定要从小公司往大公司走
  14. PC微信本地图片格式转化
  15. Hangfire 使用笔记
  16. java监听器(Listener)统计在线人数
  17. esp8266之Arduino的mqtt客户端远程继电器控制,断电重连、断网重连,断mqtt服务器重连
  18. 画思维导图的三招十八式
  19. R232接口的简单介绍
  20. html5国际证书,免费获得微软MCSD证书赶快行动吧!

热门文章

  1. 控件的颜色设置(本景色,文本色,文本背景色)
  2. 生鲜配送APP软件开发快速制作
  3. 消费金融进入“第二赛段”,突围关键是什么?
  4. 程序员通过google 赶快来赚美金~ hot
  5. 微信支付 商户号该产品权限未开通,请前往商户平台
  6. linux xxx命令,linux命令ps aux|grep xxx详解
  7. h5php大转盘抽奖,html5的非常简单圆形转盘抽奖代码
  8. vmware虚拟机桥接模式在有线/无线双网卡解决方案
  9. 开源可协作在线文档(ShowDoc)
  10. 深圳中学招聘太激烈,不是名校博士别想挤破头进去!