Chinaunix首页 | 论坛 | 博客
  • 博客访问: 251958
  • 博文数量: 137
  • 博客积分: 5005
  • 博客等级: 上校
  • 技术积分: 1360
  • 用 户 组: 普通用户
  • 注册时间: 2005-03-25 09:21
个人简介

每天进步一点点

文章分类

全部博文(137)

文章存档

2016年(1)

2013年(2)

2012年(30)

2011年(42)

2006年(27)

2005年(35)

分类:

2005-06-09 15:22:46

个人总结

Shell历史
Bourne shell (sh)
C shell (csh)
Korn shell (ksh)

三种shell 都有它们的优点和缺点
Bourne Again shell (bash), 正如它的名字所暗示的,是 Bourne shell 的扩展。BASH 与 Bourne shell 完全向后兼容,并且在 Bourne shell 的基础上增加和增强了很多特性。BASH 也包含了很多 csh 和 Korn Shell 里的优点,使得 BASH 有很灵活和强大的编程接口,同时又有很友好的用户界面。为什么要用 BASH 来代替 sh 呢?Bourne Shell 最大的缺点在于它处理用户的输入方面,在 Bourne shell 里键入命令会很麻烦,尤其当你键入很多相似的命令时,而 BASH 准备了几种特性使命令的输入变得更容易。 BASH 的新功能包括 命令补齐、通配符、命令历史记录、别名等。

bash 是为互动用户提供的默认shell

 一、bash 语法

1 变量
      Bourne Shell有如下四种变量:
     .用户自定义变量
     .位置变量即 shell script之参数
     .预定义变量(特殊变量)
     .环境变量(参考shell定制部分) 


  (1)用户自定义变量
        a="hello world"
               echo $a         
                num=2
               echo "this is the $nd"
           这将打印: this is the 2nd
        使用unset命令删除变量的赋值
        $ Z=hello
        $ echo $Z
         hello
        $ unset Z

        备注:单引号和双引号的区别

  (2)位置变量

  (3)特殊变量及保留符


  保留字符及其含义


 $ shell变量名的开始,如$var
 | 管道,将标准输出转到下一个命令的标准输入
 # 注释开始
 & 在后台执行一个进程
 ? 匹配一个字符
 *  匹配0到多个字符(与DOS不同,可在文件名中间使用,并且含.)
 $- 使用set及执行时传递给shell的标志位
 $! 最后一个子进程的进程号
 $# 传递给shell script的参数个数
 $* 传递给shell script的参数
 $@ 所有参数,个别的用双引号括起来
 $? 上一个命令的返回代码
  当前shell的名字
 $n (n:1-) 位置参数
 $$ 进程标识号(Process Identifier Number, PID)
 >   file 输出重定向
 `command` 命令替换,如 filename=`basename /usr/local/bin/tcsh`
 >>file 输出重定向,append

2 流程控制

1) if
        "if" 表达式 如果条件为真则执行then后面的部分:
                          if ....; then
                        ....
                          elif ....; then
                        ....
                          else
                        ....
                           fi

     if通常和test配合使用 形如:
                          if[ expr ]; then
                          ....
                          fi
     shell程序中的test命令

  (1)字符串操作符  用于计算字符串表达式
  test命令     |    含义
  -----------------------------------------
  Str1 = str2 | 当str1与str2相同时,返回True
  Str1! = str2| 当str1与str2不同时,返回True
     Str      | 当str不是空字符时,返回True
    -n str    | 当str的长度大于0时,返回True
    -z str    | 当str的长度是0时,返回True
  -----------------------------------------
  (2)整数操作符具有和字符操作符类似的功能.只是他们的操作是针对整数
  test表达式   |    含义
  ---------------------------------------------
  Int1 -eq int2|当int1等于int2时,返回True
  Int1 -ge int2|当int1大于/等于int2时,返回True
  Int1 -le int2|当int1小于/等于int2时,返回True
  Int1 -gt int2|当int1大于int2时,返回True
  Int1 -ne int2|当int1不等于int2时,返回True
  -----------------------------------------
  (3)用于文件操作的操作符,他们能检查:文件是否存在,文件类型等
  test表达式    |    含义
  ------------------------------------------------
  -d file      |当file是一个目录时,返回 True
  -f file      |当file是一个普通文件时,返回 True
  -r file      |当file是一个刻读文件时,返回 True
  -s file      |当file文件长度大于0时,返回 True
  -w file      |当file是一个可写文件时,返回 True
  -x file      |当file是一个可执行文件时,返回 True
  ------------------------------------------------
 (4)shell的逻辑操作符用于修饰/连接包含整数,字符串,文件操作符的表达式
  test表达式     |    含义
  ----------------------------------------------------------
  ! expr        |当expr的值是False时,返回True
  Expr1 -a expr2|当expr1,expr2值同为True时,返回True
  Expr1 -o expr2|当expr1,expr2的值至少有一个为True时,返回True
  -----------------------------------------------------------
  注意:
  tcsh shell 不使用test命令,但是tcsh中的表达式同样能承担相同的功能.tcsh
  支持的表达式于C中的表达式相同.通常使用在if和while命令中.
  tcsh表达式     |    含义
  -------------------------------------------------------
  Int1 <= int2  |当int1小于/等于int2时,返回True
  Int1 >= int2  |当int1大于/等于int2时,返回True
  Int1 < int2   |当int1小于int2时,返回True
  Int1 > int2   |当int1大于int2时,返回True
  Str1 == str2  |当str1与str2相同时,返回True
  Str1 != str2  |当str1与str2不同时,返回True
  -r file       |当file是一个可读文件时,返回True
  -w file       |当file是一个可写文件时,返回True
  -x file       |当file是一个可执行文件时,返回True
  -e file       |当file存在时,返回True
  -o file       |当file文件的所有者是当前用户时,返回True
  -z file       |当file长度为0时,返回True
  -f file       |当file是一个普通文件时,返回True
  -d file       |当file是一个目录时,返回True
  Exp1 || exp2  |当exp1和exp2的值至少一个为True时,返回True
  Exp1 && exp2  |当exp1和exp2的值同为True时,返回True
  ! exp         |当exp的值为False时,返回True
  -------------------------------------------------------


2) for
#!/usr/bin/env bash

 for myfile in /etc/r*
  do
     if [ -d "$myfile" ]
     then
       echo "$myfile (dir)"
     else
       echo "$myfile"
     fi
  done
 输出:
 /etc/rc.d (dir)
 /etc/resolv.conf
 /etc/resolv.conf~
 /etc/rpc                  

3) while
例一 : 无限回圈写法
#!/bin/sh

while : ; do
echo "do something forever here"
sleep 5
done

例二 : 强迫把pppd杀掉。
#!/bin/sh

while [ -f /var/run/ppp0.pid ] ; do
killall pppd
done

4)select 


        下面是一个例子:
        #!/bin/sh
        echo "What is your favourite OS?"
        select var in "Linux" "Gnu Hurd" "Free BSD" "Other"; do
    break
        done
        echo "You have selected $var"
       下面是该脚本运行的结果:
        What is your favourite OS?
        1) Linux
        2) Gnu Hurd
        3) Free BSD
        4) Other
        #? 1
        You have selected Linux

5)case
      file lf.gz
     这将返回:
        lf.gz: gzip compressed data, deflated, original filename,
        last modified: Mon Aug 27 23:09:18 2001, os: Unix

        我们利用这一点写了一个叫做smartzip的脚本,该脚本可以自动解压bzip2, gzip 和zip 类型的压缩文件:
        #!/bin/sh
        ftype=`file ""`
        case "$ftype" in 
        ": Zip archive"*)
     unzip "" ;;
        ": gzip compressed"*)
     gunzip "" ;;
        ": bzip2 compressed"*)
     bunzip2 "" ;;
         *) error "File  can not be uncompressed with smartzip";;
         esac
    您可能注意到我们在这里使用了一个特殊的变量。
该变量包含了传递给该程序的第一个参数值。也就是说,当我们运行:
        smartzip articles.zip
         就是字符串 articles.zip

二 Bash 进阶应用

阅读(2111) | 评论(0) | 转发(0) |
0

上一篇:软raid 方法

下一篇:fedora 中创建soft raid

给主人留下些什么吧!~~