SHELL的语法和结构

来源:互联网 发布:新还珠格格知乎 编辑:程序博客网 时间:2024/05/18 00:16
  • shbang行:
    shbang行是脚本的第一行,通知内核使用哪种shell解释脚本中的行。由散列符号(#)、bang(!)和shell的完整路劲组成。
#! /bin/csh    #! /bin/tcsh
  • 注释:
    符号#后接描述性说明组成,可从行的任意位置开始,到行尾结束。
 # This is a comment.
  • 通配符:
    也称作shell元字符,这些字符既非数字也非字母,具备特殊意义。
    *、?、[]常用于文件名扩展
    ’ ! 是历史命令符
    <、>、>>、<&和 | 符号则用于标准I/O重定向和管道
    这些字符必须用反斜杠或引号进行引用。
rm *;  ls  ??;  cat file[1-3];  !!echo "How are you?"echo Oh boy\!
  • 显示输出:
    echo命令用于向屏幕显示输出。通配符必须使用反斜杠和配对引号进行转义。
echo  "Hello to you\!"
  • 局部变量:
    局部变量的作用域被限定在当前shell中。当一个脚本执行结束或者shell退出后,它们不再可用。即:超出了作用域。可以创建局部变量并为其赋值。
set variable_name = valueset name = "Tom Jones"
  • 全局变量:
    全局变量又称环境变量。它们再当前运行的shell中创建,可由该shell派生得任意进程使用。一旦脚本结束或者定义该全局变量得shell退出,它将超出作用域。
setenv VARIABLE_NAME valuesetenv PRINTER Shakespeare
  • 提取变量值
    使用美元符号可以从变量中提取数值。
echo $variable_nameecho $nameecho $PRINTER
  • 读取用户输入
    特殊变量$<从用户输入中读取一行并将它赋给一个变量。
echo "What is your name?"set name = $<
  • 参数
    可以从命令行传递参数给脚本,有两种方法可以在脚本中得到它们的值:位置参量和argv数组。
% scriptname arg1 arg2 arg3 ...#使用位置:echo $1 $2 $3      #arg1赋给$1,arg2赋给$2等等echo $*            #所有参数#使用argv数组:echo $argv[1]  $argv[2]  $argv[3]echo $argv[*]      #所有参数echo $#argv        #参数个数
  • 数组
    数组是用空格隔开的一列词组成的词表,由一对圆括号括起来。内置的shift命令将词表左数第一个单词移开。与C语言不同的是,使用索引访问数组中的某个单词,索引值从1开始,而不是从0开始。
set word_list = ( word1 word2 word3 )set name = ( Tom Dick Harry Fred )shift names          #将Tom从词表中去掉echo $word_list(1)   #显示词表中的第1个元素echo $word_list(2)   #显示词表中的第2个元素echo $word_list or $word_list(*)#显示词表中所有元素echo $names[1]echo $names[2]echo $names[3]echo $names or echo $names[*]
  • 命令替换
    将UNIX/Linux命令的输出赋给一个变量,或者在字符串中使用某个命令的输出,命令由反引号引起来。
set variable_name='command'echo $variable_nameset now = 'date'    #反引号中的命令被执行,其输出赋给变量nowecho $nowecho "Today is 'date'"  #date命令的输出被插入到字符串中
  • 算术运算
    保存算术运算结果的变量必须以一个@符号加一个空格开头。
@ n = 5 + 5echo $n
  • 运算符
#等式运算符==    !=#关系运算符>     大于>=    大于等于<     小于<=    小于等于#逻辑运算符&&    与||    或!     非
  • 条件语句
    if结构后跟着一个用括号括起来的表达式。运算符类似于C运算符,关键字then放在闭括号之后。if必须由endif结束。if/else if 等价于switch语句。
#if结构if ( expression ) then   block of statementsendif#if/else结构if ( expression ) then   block of statementselse   block of statementsendif#if/else/else if结构if ( expression ) then   block of statementselse if ( expression ) then   block of statementselse if ( expression ) then   block of statementsendif#switch结构switch variable_name    case constant1:        statements    case constant2:        statements    case constants3:        statementsdefault:    statementsendswswtich ("$color")     case blue:    echo $color is blue    breaksw     case green:        echo $color if red or orange        breaksw     default:     echo "Not a valid color"endsw
  • 循环语句
    有两种类型的循环,while循环和foreach训话。
    while循环后哦跟着一个用圆括号括起来的表达式,一个语句段,最后以关键字end结束,只要表达式为真,循环将会一直持续。
    foreach循环后跟着一个变量,一个用圆括号括起来的词表,一个语句段,最后以关键字end结束。foreach循环遍历词表,对每个词进行处理后将其移开,然后继续处理下一个词,当词表中所有词都被移走后,循环结束。
    循环控制命令为break和continue。
while ( expression )    block of statementsendforeach variable ( word list )    block of statementsend###############foreach color (red green blue)    echo $colorend
  • 文件测试
    C shell 有一个内置的选项集可以用来测试文件属性,例如文件是否是目录文件、普通文件(不是目录)、可读文件等。使用UNIX test命令还可以进行其他类型的文件测试。使用方法参见范例。
-r 当前用户可以读该文件-w 当前用户可以写该文件-x 当前用户可以执行该文件-e 该文件存在-o 该文件属于当前用户-z 该文件长度为0-d 该文件是一个目录-f 该文件是一个普通文件
#范例#!/bin/csh -f1  if ( -e file ) then    echo file exists   endif2  if ( -d file ) then    echo file is a directory   endif3  if ( ! -s file ) then    echo file is not of zero length   endif4  if ( -r file && -w file ) then    echo file is readable and writable   endif
0 0