Chinaunix首页 | 论坛 | 博客
  • 博客访问: 643953
  • 博文数量: 227
  • 博客积分: 8017
  • 博客等级: 中将
  • 技术积分: 2069
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-08 22:50
文章分类

全部博文(227)

文章存档

2011年(10)

2010年(55)

2009年(28)

2008年(134)

我的朋友

分类: LINUX

2008-05-11 21:59:02

第二部分 进阶

2. 循环与分支:
  • for循环:
    • 循环结构 for args in [list]
              do
                 command
              done
    • example:
      #!/bin/bash

      for planet in Mercury Venus Earth Mars Jupiter Saturn Uranus Neptune Pluto
      do
          echo $planet  # 每个行星都被单独打印在一行上.
      done

      declare -i count=0
      for planet in "Mercury Venus Earth Mars Jupiter Saturn Uranus Neptune Pluto"
      do
          echo $planet #所有的行星名称都打印在同一行上.
          ((count++))
      done

      echo $count ##count=1

      for file in [jx]* ##删除当前目录下以j,x开头的文件
      do
          rm -f $file
          echo "remove file $file"
      done
      exit 0

  • while循环
    • 循环结构: while [condition]
               do
                    command
               done
  • until 循环
    • 这个结构在循环的顶部判断条件, 并且如果条件一直为false, 那么就一直循环下去. (与while循环相反).
    • until [condtion-is-true]
      do
         command
      done
  • 循环控制: break 和continue (跟c语言语法一致)
  • case 与select结构:
    • case "$variable" in
           "$condition1" )
           command...
           ;;

           "$condition2" )
           command...
           ;;
      esac
    • example:
      #!/bin/bash

      echo "Hit a key then hit ENTER"
      read key

      case "$key" in
          [[:lower:]] )
              echo "$key is lower case"
              ;;
          [[:upper:]] )
              echo "$key is upper case"
              ;;
          [0-9] )
              echo "$key is digit"
              ;;
          * ) echo "other character!"
              ;;
      esac
      exit 0
  • select: select结构是建立菜单的另一种工具, 这种结构是从ksh中引入的.
  • select "$variable" [in list]
    do
       command
       break
    done
  • 提示用户输入选择的内容(比如放在变量列表中). 注意: select命令使用PS3提示符, 默认为(#?), 当然, 这可以修改. 如果忽略了in list列表, 那么select命令将会使用传递到脚本的命令行参数($@), 或者是函数参数(当select是在函数中时).
  • example:
    #!/bin/bash

    PS3='select your favorite vegetable:'
    select vegetable in "beans" "carrots" "potatoes" "onions" "rutabagas"
    do
       echo "your favorite vegetable is $vegetable"
       break
    done

    exit 0

3. 内建命令:

  • 内建命令指的就是包含在Bash工具包中的命令, 从字面意思上看就是built in. 这主要是考虑到执行效率的问题 -- 内建命令将比外部命令执行的更快, 一部分原因是因为外部命令通常都需要fork出一个单独的进程来执行,另一部分原因是特定的内建命令可以直接访问shell的内核部分.
  • 一个内建命令通常会与一个系统命令同名, 但是Bash在内部重新实现了这些命令. 比如, Bash的echo命令与/bin/echo就不尽相同, 虽然它们的行为在绝大多数情况下都是一样的.
  • 内建命令列表:
    • echo
      • echo -e 打印转义字符 ;; echo "hello,world\n"
      • echo -n 不还换行
      • echo `command` 将会删除任何由command所产生的换行符. 但 res=`command`;echo "$res"却不会删除换行符。而echo $res不行。
    • printf
      • 格式化输出, 是echo命令的增强版. 它是C语言printf()库函数的一个有限的变形, 并且在语法上有些不同. 这是Bash的内建版本, 与/bin/printf或者/usr/bin/printf命令不同.
      • 语法: printf formate-string ... parameter...
      • example: msg=hello;i=9;printf "msg=%s, i=%d\n" $msg $i
    • read
      • stdin"读取"一个变量的值, 使用-a参数可以read数组变量
      • read -n 3 var#读取3个字符 或写成read -n3 var
      • reat -t 3 var ##-t指定timeout
      • example: read -t2 -n1 var;echo $var
    • cd ,pwd
    • pushd, popd, dirs
      • 这几个命令可以使得工作目录书签化, 就是可以按顺序向前或向后移动工作目录. 压栈的动作可以保存工作目录列表. 选项可以允许对目录栈做不同的操作.
      • pushd dir-name把路径dir-name压入目录栈, 同时修改当前目录到dir-name.
      • popd将目录栈最上边的目录弹出, 同时将当前目录修改为刚弹出来的那个目录.
      • dirs列出所有目录栈的内容,一个成功的pushd或者popd将会自动调用dirs命令.
    • let
      • 执行变量的算术操作. 在许多情况下, 它被看作是复杂的expr命令的一个简化版本.
      • example: let "a += 4"
    • eval
      • eval arg1 [arg2] ... [argN] 将表达式中的参数, 或者表达式列表, 组合起来,然后执行它们。
      • example: res=`eval ls -l` ;echo "$res"
    • set/unset
      • 用来修改/撤销修改内部脚本变量的值.
    • declear/typeset
    • readonly (==declare -r)
    • getopts:
      • 可以说这个命令是分析传递到脚本中命令行参数的最强力的工具. 这个命令与外部命令getopt还有C语言中的库函数getopt的作用是相同的. 它允许传递和连接多个选项到脚本中, 并且能够分配多个参数到脚本中 (man getopts)
    • source (等同于.)
      • 当在命令行中调用的时候, 这个命令将会执行一个脚本. 当在脚本中调用的时候, source file-name 将会加载file-name文件,source一个文件(或点命令)将会在脚本中引入代码, 并将这些代码附加到脚本中(与C语言中的#include指令效果相同). 最终的结果就像是在使用"source"的行上插入了相应文件的内容. 在多个脚本需要引用相同的数据, 或者需要使用函数库的情况下, 这个命令非常有用.
      • source date-file <==> .data-file
    • exit
    • exec
      • 这个shell内建命令将使用一个特定的命令来取代当前进程. 一般的当shell遇到一个命令, 它会forks一个子进程来真正的运行命令. 使用exec内建命令, shell就不会fork了, 并且命令的执行将会替换掉当前shell. 因此, 在脚本中使用时, 一旦exec所执行的命令执行完毕, 那么它就会强制退出脚本.
    • true/false
      • example: if true; then ...
    • type [cmd]
      • 与外部命令which很相像, type cmd将会给出"cmd"的完整路径. 与which命令不同的是, type命令是Bash内建命令. -atype命令的一个非常有用的选项, 它用来鉴别参数是关键字还是内建命令, 也可以用来定位同名的系统命令.
    • help
      • 获得shell内建命令的一个小的使用总结. 与whatis命令比较象, 但help命令是内建命令. eg: help echo

  • 作业控制命令
    • jobs :在后台列出所有正在运行的作业, 给出作业号, 作业进程的概念太容易混淆了. 特定的内建命令 比如kill, disown, 和wait命令即可以接受作业号为参数, 也可以接受进程号为参数. 但是fg, bgjobs命令就只能接受作业号为参数.
    • fg/bg :fg命令可以把一个在后台运行的作业放到前台来运行. 而bg命令将会重新启动一个挂起的作业, 并且在后台运行它. 如果使用fg或者bg命令的时候没有指定作业号, 那么默认将对当前正在运行的作业进行操作.
    • wait :停止脚本的运行, 直到后台运行的所有作业都结束为止, 或者如果传递了作业号或进程号为参数的话, 那么就直到指定作业结束为止. 返回等待命令的退出状态码。你可以使用wait命令来防止在后台作业没完成(这会产生一个孤儿进程)之前退出脚本.
    • suspend :这个命令的效果与Control-Z很相像, 但是它挂起的是这个shell
    • logout :退出一个已经登陆上的shell, 也可以指定一个退出状态码.
    • times :给出执行命令所占用的时间
    • kill/killall 通过发送一个适当的结束信号, 来强制结束一个进程
    • enable :这个命令或者禁用内建命令或者恢复内建命令. 比如, enable -n kill将禁用内建命令kill, 所以当我们调用kill命令时, 使用的将是/bin/kill外部命令.
阅读(937) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~