C shell编程笔记


一. 简介
1. 脚本开头是#!/bin/csh或者#!/bin/tcsh
2. 脚本开始执行时会首先读取.cshrc(.tcshrc)文件,在脚本的第一行使用-f选项将不再执行#!
3. 脚本注释使用'#'
4. 使编写好的脚本可执行 chmod +x script_name
5. 脚本中使用变量的方法是$VARIABLE_NAME或者是${VARIABLE_NAME}.脚本中使用反斜杠\可以转义历史替换符'!'
6. 脚本中使用`command`可以执行命令,但是如果输出结果中有换行则会被替换为空格
7. 设置变量set variable_name = XXX, 取消变量 unset variable_name

二. 用户输入
1. 标准的读取用户输入的方式为: set input = $<
2. 如果输入包含空格分开的多个字符串,则使用:set input = "$<",否则input的值是第一个词,而$<为所有的输入数据
3. 可以将用户的输入数据转换为字符串数组,对于1和2中的输入方式,input和$input[1]是相同的。注意,C shell中数组下标是从1开始
4. 使用set input = ( $< ),可以将用户的输入转换为字符串数组,并使用$input[i]访问第i个元素

三. 算术运算
1. C shell只支持整数运算,使用符号'@'将计算结果赋给数值变量
2. C shell支持的算术运算符包含+,-,*,/,%,<<,>>.含义同C语言相同。此外还支持 ++, --, +=, *=等操作符.不过在linux中>>,<<支持的并不是很好
3. 算术运算表达式规则比较繁琐,比较简单的方法就是在每个元素中间都添加空格,例如:@ a = 3 + 4; @ a ++
4. 对于浮点数的算术运算可以使用bc或者awk,例如set sqrt2 = `ehco "scale=100; sqrt(2) | bc"`

四. 脚本运算
1. csh -x script_name,对每一行执行变量替换,显示,然后执行
2. csh -v script_name,原样显示脚本行,然后执行
3. csh -n script_name,解释命令,但不执行.
4. set echo,对每一行执行变量替换,显示,然后执行
5. set verbose,原样显示脚本行,然后执行
6. #!/bin/csh -xv 或者是 #!/bin/tcsh -xv,可以同时打开回显和详细功能.

五. 命令行参数
1. 两种参数形式,位置参量和argv
2. 位置参量,C shell脚本的参数数量没有限制。使用$i(i>1 && i <10) 或者${i}(i>10)访问第i个变量,$0表示脚本名,$*表示所有的位置参量
3. argv变量,argv变量的下标从1开始.argv不包含脚本明。使用$argv[i]访问第i个参数,$argv[*]表示所有参数,$argv也表示所有参数,$#argv表示参数的个数,$argv[$#argv]表示最后一个参数。

六. 条件结构和流控制
1. 比较和逻辑运算符: ==(等于),!=(不等于),>(大于),<(小于),>=(大于等于),<=(小于等于),=~(字符串匹配),!~(字符串不匹配),!(逻辑非),||(逻辑或),&&(逻辑与).其中&&和||的执行模式和C语言相同。
2. 运算符优先级从高到低分别为 (), ~, !, * / %, + -, << >>, >>= <<=, == !=, =~ !~, &, ^, |, && , ||
3. if语句格式:
    if ( 表达式 ) then
       命令1
       命令2
       ....
    endif
4. if-else语句格式:
    if ( 表达式 ) then
       命令1
       命令2
       ....
    else
       命令3
       命令4
       ....
    endif
5. if-else if 语句格式:
    if ( 表达式 ) then
       命令11
       命令12
       ....
    else if ( 表达式 ) then
       命令21
       命令22
       ....
    ...
    else
      命令n1
      命令n2
      ....
    endif
6. 简单if格式:
    if ( 表达式 ) 命令1
7. 调用exit可以退出脚本程序,eixt可以带有一个整型参数
8. 在条件表达式中对命令求值的办法是在外面再套一层花括号,例如 if { ( who | grep $1 >& /dev/null ) } then, 可以对上面的求值结果取反,方法为:
    if ! { ( who | grep $1 >& /dev/null ) } then
9. goto语句可以跳转到某个标号处,标号的定义和C语言一样。
10. C shell的内置选项对文件进行测试:
     -d 该文件是目录;  -e 该文件存在; -f 该文件是个普通文件; -o 该文件归当前用户所有; -r 用户可以读此文件; -w 用户可以写此文件;
     -x 用户可以执行此文件; -z 该文件长度为0;
     在if语句中的使用方法为 if ( -d fileName ) then ...
11. C shell的test命令与文件测试:
     -b 对象是块特殊文件; -c 对象是字符特殊文件; -d 对象存在且是目录; -f 对象存在且是普通文件; -g 对象的set-group-ID位被置1;
     -k 对象的sticky位被置1; -p 对象是管道文件; -r 对象可读; -s 对象存在且非空; -t n n是终端的文件描述符; 
     -u 对象的set-user-ID位被置1; -w 对象可写; -x 对象可执行;
     在if语句中的使用方法为if { -c file } then ...
12. 条件结构可以嵌套
13. TC shell的文件测试
     -b,-c,-d,-e,-f,-g,-k,-o,-p,-r,-t n,-w,-x,-z的含义同上。
     -l 对象是符号链接;  -L ??
14. 在TC shell中,可以将多个标识合并在一起例如 if ( -rwx file ) then...
15. 在TC shell中,也可以使用filetest命令也可以将多个标识合并在一起,例如: filetest -lrx /dev/fd
16. -A 文件最后访问时间,从UNIX EPOCH开始的秒数; -A: 同A,不过使用时间戳格式
     -M 文件最后修改时间,从UNIX EPOCH开始的秒数; -M:同M,不过使用时间戳格式
     -C inode节点最后修改时间,从UNIX EPOCH开始的秒数; -C:同C,不过使用时间戳格式
     -F 组合文件标识符,以设备:索引节点的形式表示;   -G 组ID号
     -G:组名称,如果组位置,则使用组ID号;  -L 符号链接指向的文件名称
     -N 链接数量; -P八进制表示的权限,最前面不带0; -P:八进制表示的权限,但是最前面带0
     -Pmode 等价于-P file & mode.假设对同组用户和其他用户可以,-P22 file将返回22.若仅对同组用户可写,则返回20.如果都不可写,则返回0
     -Mode:同PMode类似,但是最前面带0
     -U 用户ID号; -U:用户名,若用户名位置,则使用用户ID号
     -Z 以字节为单位的文件大小
17. switch语句的格式为:
     switch(变量)
       case 常量1:
         命令11
         命令12
         ....
         breaksw
       case 常量2:
         命令21
         命令22
         ....
         breaksw
       ...
       case 常量n:
         命令n1
         命令n2
         ....
         breaksw
       default:
         命令n1
         命令n2
         ....
         breaksw
    endsw
    常量处可以使用正则表达式来匹配变量。switch的语义和C语言中的switch语句相同。
18. Here菜单
    格式为:
    cat << EOF
    multiple
    line 
    sentences.
    EOF
    通常用来显示菜单和switch搭配使用。

七. 循环结构
1. C shell提供两种循环:foreach循环和while循环。如果要对项目清单中的每一项都做处理,应使用foreach循环。如果直到满足某个条件后才退出循环,应使用while循环。
2. foreach循环的格式:
    foreach 变量 (词表)
        命令
    end
3. while循环的格式为:
    while ( 条件表达式 )
      命令
    end
4. repeat命令格式为:
    repeat n 命令
    表示将命令执行n次
5. shift命令将argv数组向左移动,移出的词将不存在于词表中了,因此argv数组的长度也将减1. shift也可以移动数组,注意使用格式为shift arr_name,不是shift $arr_name
6. break命令,跳出循环
7. continue命令,继续从头开始执行循环

八. 中断处理
1. onintr 标号; 用户按下ctrl+c之后,程序将跳转到标号处开始执行
    onintr -;用户按下ctrl+c之后,对程序不起任何作用
2. C shell中能处理的信号只有ctrl+c产生的interruption信号

九. setuid脚本
1. 脚本中第一行为#!/bin/csh -feb
    f,fast,快速启动,不执行.cshrc
    e,如果有中断,程序立即退出
    b,次脚本设置了setuid
2. 然后修改脚本的权限,方法为:
    chmod 4755 script_name 或者
    chmod +srx script_name

十. 保存脚本
1. 修改环境变量,将脚本所在的目录放置到公共目录中,然后修改path环境变量,将此目录的路径添加到path中。

十一. 内置命令
alias, bg[%job], break,breaksw,case lablel:, cd [dir],chdir [dir], contine, default:, dirs [-l], echo [-n] list, eval command, exec command, exit [expr], fg [%job], foreach var (wordlist), goto label, hashstat, history [-hr][n], if (expr), else if(expr) then, jobs [-l], kill [-sig] [pid] [%job].., kill -l, limit [-h] [resource[max-use]], login[username|-p],logout,nice [+n|-n][command], nohup [command], notify[%job], onintr[-|label],popd[+n],pushd[+n|dir],rehash,repeat count command,set [var [= value]], setenv [var [word] ], shift [variable],source [-h] name, stop[%job]...,suspend,switch(string),time[command],umask[value],unalis pattern, unhash, unset pattern, unlimit [-h] [resource], unsetenv variable, wait, while (expr)

附A:技巧和注意
1. 使用$?来测试某个变量是否被设置,若设置,返回真;否则返回false.
2. $?promp可以用来测试prompt变量是否被设置.通过检测prompt变量可以用来判断当前是在交互模式下还是脚本中。
3. 使用!之类的单操作符时,应该注意后面有个空格
4. 在if语句中操作包含多个单词的变量时,变量要加双引号
5. 检查Unix命令执行成功的方法是判断status变量是否等于0.
6. 使用别名(alias)来创建自定义的错误诊断信息。例如,alias Usage 'echo "    Usage:$0 require fileName. \!*; exit 2"' 在调用Usage时,可以使用字符串参数,将被!*替换。例如:Usage "Please input file name.".输出信息为:"    Usage:checkfile require fileName. Please input file name.".在参数中也可以使用变量。
7. 在()中执行命令可以产生字符串数组,例如( `ls` )可以产生以当前目录所有文件名构成的字符串数组
8. 注意break和switch中的breaksw含义不同,breaksw表示跳出switch语句,而break表示跳出最近的一层循环语句
9. repeat n break可以跳出多重循环
10. PATH和path的区别:
     PATH是环境变量所有shell都能看到的统一值,而path是当前shell中设置的局部变量。设置PATH和path的语法是不同的:
     setenv PATH newpath1:newpath2:$PATH
     set path ( newpath1 newpath2 $path )
附B: 关于词表
1. 词表的创建方式有:
    ( li chao 123 )
    ( `ls` )
     ( *.c )  //当前目录中匹配的文件
    ( $* )
    ( $< ) 
2. 词表的一个例子为path环境变量,下例为词表长度的增加:
    set a = ( 1 2 3 )
    set b = ( $a 4)
    这时,b将变成( 1 2 3 4 )
  • 9
    点赞
  • 90
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
个人前几年学习Vxworks时,整理的笔记,总给大家了。 1 基于硬盘启动的Vxworks环境搭建 3 2 Vxworks引导盘制作 6 2.1 通过DOS加载VxWorks方法 6 2.2 Bootrom三种类型 7 2.3 VxWorks映象 7 2.4 Bootrom.sys最快制作方法 8 2.5 从网络引导 8 2.6 从本地硬盘引导 9 2.7 制作bootrom文件 9 2.8 Bootrom编译步骤 11 2.9 用BSP生成Bootable工程(即我们的程序文件) 12 2.10 FTP Server下载VxWorks 14 3 Tornado调试环境的建立 17 3.1.1 配置文件config.h 17 3.1.2 网络连接 18 6 从主机搭接(attach)到目标机 21 7.1.3 串口连接 21 4 4.Config.h文件注释说明 22 4.1 启动行说明 #define DEFAULT_BOOT_LINE \: 22 4.2 Config.h 文件说明 23 4.3 启动参数结构体 BOOT_PARAMS 35 4.4 booting过程介绍,比较详细 38 5 sysClkRateGet();返回系统时钟每秒的tick数量, tick详解 43 6 中断应用设计要点 44 7 驱动程序设计 49 8 缩短vxworks的启动时间 51 9 调试篇 54 10 驱动编程步骤 54 10.1 将驱动程序增加到“系统驱动程序列表”中 54 10.2 将设备增加到“系统设备列表”中 55 10.3 打开设备,得到文件描述符 55 10.4 SELECT机制的使用 55 10.4.1 select( )函数翻译 57 11 VxWorks系统的网络驱动(END) 60 12 VXworks操作系统中信号量用于多任务同步与互斥的讨论 62 12.1 二进制信号量实现互斥和同步 64 12.1.1 互斥的实现: 64 12.1.2 同步的实现: 65 12.2 互斥信号量 67 13 Tornado的文件目说明录 68 14 Shell 内置命令说明 72 14.1 任务管理 72 14.2 任务状态信息 72 14.3 系统修改和调试 73 14.4 对象命令( WindSh Commands for Object Display ) 73 14.5 WindShell and Browser, Shell 命令 74 15 驱动篇 81 16 中断篇 83 16.1 中断服务程序ISR编写注意事项 83 16.2 中断号与中断向量的转换 83 16.3 安装中断服务程序 intConnect() 83 16.4 调试中断服务程序方法 84 17 mkboot批处理命令详细解释 84 18 MakeFile 说明 85 19 VxWorks5.4中的输入输出重定向 89 19.1 vxworks屏幕输出, 一般来说用printf都是串口/shell输出,串口输出就可以到屏幕上了? 89 19.2 20.2 VxWorks中针对X86开发时标准输入输出的重定向? 90 20 怎样加入外部.o文件? 92 21 如何在Vxworks中使用 cd ,pwd , ls 命令:启用File System and Disk Utilities组件(INCLUDE_DISK_UTIL),可在shell下用pwd/cd/ls等命令 93 22 Error: image is larger than 524288 bytes 94 23 proxyArpDefaultOn()未定义解决方法? 94 24 如何将VxWorks的系统定时间隔或系统Ticks设置为1ms????? 95 25 read/write、fread/fwrite、fopen/open有什么区别 96 26 快速启动??????????????? 100 27 启动时报ATA0a和硬盘启动相关问题 100 28 如何安装USB2.2新版本及编译USB驱动? 101 29 WindML、图形界面相关问题 102 29.1 WindML,ugldemo出错? 102 29.2 5101 VxWorks黑屏问题? 102 29.3 添加ugldemo.c后,编译报undefined reference to “ugltextdraw” 错误一大堆? 102 29.4 WindML 中文字库显示? 103 30 VxWork6.8相关问题 105 30.1 ELF和bin文件的区别? 105 30.2 diab和GNU的区别? 106 31 No such file or directory错误? 107

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值