zoukankan      html  css  js  c++  java
  • Linux Shell脚本编写规范、例子

    一、规范

    Linux的Shell种类众多,常见的有:Bourne Shell(/usr/bin/sh或/bin/sh)、Bourne Again Shell(/bin/bash)、C Shell(/usr/bin/csh)、K Shell(/usr/bin/ksh)、Shell for Root(/sbin/sh),等等。不同的Shell语言的语法有所不同,所以不能交换使用。每种Shell都有其特色之处,基本上,掌握其中任何一种 就足够了。在本文中,我们关注的重点是Bash,也就是Bourne Again Shell,由于易用和免费,Bash在日常工作中被广泛使用;同时,Bash也是大多数Linux系统默认的Shell。在一般情况下,人们并不区分 Bourne Shell和Bourne Again Shell,所以,在下面的文字中,我们可以看到#!/bin/sh,它同样也可以改为#!/bin/bash。

    利用vi等文本编辑器编写Shell脚本的格式是固定的,如下:

    #!/bin/sh

    #comments

    Your commands go here

    首行中的符号#!告诉系统其后路径所指定的程序即是解释此脚本文件的Shell程 序。如果首行没有这句话,在执行脚本文件的时候,将会出现错误。后续的部分就是主程序,Shell脚本像高级语言一样,也有变量赋值,也有控制语句。除第 一行外,以#开头的行就是注释行,直到此行的结束。如果一行未完成,可以在行尾加上",这个符号表明下一行与此行会合并为同一行。

    编辑完毕,将脚本存盘为filename.sh,文件名后缀sh表明这是一个Bash脚本文件。执行脚本的时候,要先将脚本文件的属性改为可执行的:

    chmod +x filename.sh

    执行脚本的方法是:

    ./filename.sh

    二、Shell的基本知识

    与其他语言不同,Shell Script中if语句的条件部分要以分号来分隔。第三行中的[]表示条件测试,常用的条件测试有下面几种:

    [ -f "$file" ] 判断$file是否是一个文件

    [ $a -lt 3 ] 判断$a的值是否小于3,同样-gt和-le分别表示大于或小于等于

    [ -x "$file" ] 判断$file是否存在且有可执行权限,同样-r测试文件可读性

    [ -n "$a" ] 判断变量$a是否有值,测试空串用-z

    [ "$a" = "$b" ] 判断$a和$b的取值是否相等

    [ cond1 -a cond2 ] 判断cond1和cond2是否同时成立,-o表示cond1和cond2有一成立

    要注意条件测试部分中的空格。在方括号的两侧都有空格,在-f、-lt、=等符号两侧同样也有空格。如果没有这些空格,Shell解释脚本的时候就会出错。

     

          Linux中bash shell语音保留的关键字:

    case

    elif

    let

    clear

    else

    read

    continue

    if

    then

    echo

    for in

    while

     

     

    2.1. shell提示符及其环境

    提示符:$

    环境:Linux,Unix,Dos等等

    ? Shell其实就是一个解释执行命令的程序,所谓shell编程其实就是用一定的语法将各种基本的命令组合起来,让shell程序去解释执行。

    同传统的编程语言一样,shell提供了很多特性,这些特性可以使你的shell script编程更为有用,如:数据变量、参数传递、判断、流程控制、数据输入和输出,子程序及以中断处理等。

    2.2 如何执行shell程序

    Shell程序(***.sh)

    ? 执行这个命令时

    (1) #./***.sh

    (2) #chmod u+x ***.sh

    #***.sh

    (3) #sh ***.sh

    2.3 常量

    ? 字符串,例如“Hello World!”。

    ? 数字,例如705,23。

    2.4 变量

    shell编程中它们是没有类型的,简称弱类型编程语言,在这个变量中可以保含一个数字,一个字符串,一个单词等。你并不需要声明这个变量,它会在引用这个变量时创建它。

    STR="Hello World!"

    echo $STR

      HOME="/home"                //注意赋值不要有空格

      a=123

      HOME_LIST=$(ls /home) //把命令的执行结果赋值给变量

      ehco $HOME                   //$ 符号是获得变量HOME的值

      a=a+1

    系统变量:

      $0 这个程序的执行名字

      $n  这个程序的第n个参数值,n=1...9

      $*  这个程序的所有参数

      $# 这个程序的参数个数

      $$ 这个程序的PID

      $! 执行上一个背景指令的PID

         $? 上一个指令的返回值

    2.5 局部变量

          局部变量一般是指写在函数中的变量,他的生命力是有限的。局部变量比较好理解,这里就不再多介绍了。

    2.6 从键盘输入变量值

    使用read命令

    read var1 var2 … varn

    2.7 注释

    ?Shell编程中的注释以#开头

    2.8 数字运算

    主要是指整数运算。expr命令可以将字符型变量转换为整数进行操作

    语法:expr integer operator integer

    其中operator为+ - * / %, 但对*的使用要用转义符/,如:

    [oracle@localhost ~]$ more dvd.sh

    #!/bin/bash

    expr 5 /* 5

    [oracle@localhost ~]$ sh dvd.sh

    25

    2.9 逻辑运算

    test进行逻辑运算,用[ ]括起来就是test运算

    int1 -eq int2 相等?

    int1 -ne int2 不等?

    int1 -gt int2 int1 > int2 ?

    int1 -ge int2 int1 >= int2 ?

    int1 -lt int2 int1 < int2 ?

    int1 -le int2 int1 <= int2

    2.10 双引号及单引号

    ?$echo "$HOME $PATH"  -- 显示变量值

    /home/hbwork opt/kde/bin:/usr/local/bin:

     $echo '$HOME $PATH'  -- 显示单引号里的内容

    $HOME $PATH

    2.11 空格

    由于shell对命令中的多余的空格不作任何处理 ,而用引号括起来则可以防止shell去掉这些空格。

    $ str1=abcd

    $ str2="abcd "

    2.12 分支结构

    2.12.1 结构一

    if [ variable = value ]

    then

    command

    else

    if [ variable = value ]

    then

    command

    else

    command

    fi

    2.12.2 结构二

    if [ variable = value ]

    then

    command

    elif [ variable = value ]

    then

    command

    fi

    if 语句示例:

    if [ "22" -lt "33" ]   then   //注意空格

      echo "22 less than 33"

      else

      echo "no"

    fi                                  //if语句的结束

    2.13 Case语句

    case value in

    pattern1)

    command;;

    pattern2)

    command;;

    ...

    patternn)

    command;

    esac

    case 示例:

      echo "enter a number"

      read ans                    //读取一个变量read

      case $ans in

      1)

      echo   "you numer is $ans"

      ;;                                //注意符号是两个 ;

      2)

      echo "you number is 2"

      ;;

      [3-9])

      echo "you number is $ans"

      ;;

      *)                                   //*通配符

      echo "others"

    esac

    2.14 And 和 Or

    command1 && command2

    ? command1 || command2

    2.15 循环语句

    2.15.1 For循环

    for var in arg1 arg2 ... argn

    do

    command

    ....

    command

    done

    For循环示例

    int=1

    for $int in 1 2 3 4 5

    do

    sq=`expr $int /* $int`

    echo $sq

    int=`expr $int + 1`

    done

    2.15.2 while循环

    while command

    do

    command

    command

    command

    ...

    Done

    While循环的示例

    int=1

    while [ $int -le 5 ]

    do

    sq=`expr $int /* $int`

    echo $sq

    int=`expr $int + 1`

    done

    2.15.3 until循环结构

    until command

    do

    command

    command

    ....

    command

    done

    Until循环示例

    ? int=1

    until [ $int -gt 5 ]

    do

    sq=`expr $int /* $int`

    echo $sq

    int=`expr $int + 1`

    done

    2.16 从循环中退出: break和continue命令

    break 立即退出循环

    continue 忽略本循环中的其他命令,继续下一下循环

    2.17 函数 (子过程)

    funcname()

    {

    command

    ...

    command; #分号

    }

    函数示例

    setup ()

    { command list ; }

    do_data ()

    { command list ; }

    setup

    do_data

    2.18  shell程序的调试

    ? 使用-x进行跟踪执行,执行并显示每一条指令。

    2.19 比较运算符

    2.19.1 文件比较运算符

      -e filename        如果 filename 存在,则为真            [ -e /var/log/syslog ]

      -d filename       如果 filename 为目录,则为真       [ -d /tmp/mydir ]

      -f filename        如果 filename 为常规文件,则为真 [ -f /usr/bin/grep ]

      -L filename        如果 filename 为符号链接,则为真   [ -L /usr/bin/grep ]

      -r filename          如果 filename 可读,则为真              [ -r /var/log/syslog ]

      -w filename        如果 filename 可写,则为真            [ -w /var/mytmp.txt ]

      -x filename         如果 filename 可执行,则为真           [ -L /usr/bin/grep ]

      filename1 -nt filename2 如果 filename1 比 filename2 新,则为真 [ /tmp/install/etc/services -nt /etc/services ]

      filename1 -ot filename2 如果 filename1 比 filename2 旧,则为真 [ /boot/bzImage -ot arch/i386/boot/bzImage ]

     

    2.19.2 字符串比较运算符 (请注意引号的使用,这是防止空格扰乱代码的好方法)

      -z string               如果 string 长度为零,则为真          [ -z "$myvar" ]

      -n string              如果 string 长度非零,则为真               [ -n "$myvar" ]

      string1 = string2 如果 string1 与 string2 相同,则为真 [ "$myvar" = "one two three" ]

      string1 != string2 如果 string1 与 string2 不同,则为真 [ "$myvar" != "one two three" ]

      

    2.19.3 算术比较运算符

      num1 -eq num2                 等于                            [ 3 -eq $mynum ]

      num1 -ne num2                不等于                         [ 3 -ne $mynum ]

      num1 -lt num2                    小于                            [ 3 -lt $mynum ]

      num1 -le num2              小于或等于                       [ 3 -le $mynum ]

      num1 -gt num2                    大于                            [ 3 -gt $mynum ]

      num1 -ge num2               大于或等于                     [ 3 -ge $mynum ]

    三、实例

    #/bin/sh
    filename=`date +%Y%m%d%H%I%M`
    mysqldump -uroot -p560e25cafb test>/home/mysql/test$filename.sql   //备份数据库

    #/bin/sh
    echo "this is mailtest" | mail -s "hello" 42975647xx@qq.com  //发送邮件

    四. Shell 的一些注意事项

    3.1. 基础

      #!/bin/bash   //bash脚本第一句都是这个,他会让系统指定以bash来解释这个脚本

    #                 //shell脚本注释符号

    3.2. 变量

    变量赋值的时候"="两边的内容要紧靠"="

    例如:sum=0,写java写的时间长了总喜欢写成sum = 0,但是这样的结果是编辑器不识别

    3.3. 在使用if、while时,在注意变量与符号之间的分割

    例如:if [ `expr $a % 3` -ne 0 ],while [ "$var" != "end" ],尽量分开写,这样也挺好看也便于识别。

    3.4.  let的意思是让"="后面的内容做算术运算,例如:let x=a-b

    3.5. 大多数情况下,可以使用测试命令来对条件进行测试,比如可以比较字符串、判断文件是否存在及是否可读等等……通常用" [ ] "来表示条件测试,注意这里的空格很重要,要确保方括号前后的空格。

    [ -f "somefile" ] :判断是否是一个文件

    [ -x "/bin/ls" ] :判断/bin/ls是否存在并有可执行权限

    [ -n "$var" ] :判断$var变量是否有值

    [ "$a" = "$b" ] :判断$a和$b是否相等

    3.6 几个简单例子

      for filename in $(ls)

      do

      cat $filename

      done

     

      for((i=0; i<10; i++))

      do

      echo $i

      done

      x=1

      sum=0

      while [ $x -le 10 ]  //注意[ ] 两边的空格

      do

      let sum=sum+$x   //shell中算术计算使用let

      let x=x+1

      done

      echo $sum

  • 相关阅读:
    win7下环境搭建
    python简介-copy
    解决MindManager缺少mfc100u.dll无法启动的难题-转载
    Svn win7系统下状态图标不显示-转载
    【R笔记】order函数例子
    【R笔记】R语言进阶之4:数据整形(reshape)
    【R笔记】R语言利器之ddply
    天池新人实战赛之[离线赛]题目与思路
    第一次写博客
    程序员需要有多懒 ?- cocos2d-x 数学函数、常用宏粗整理
  • 原文地址:https://www.cnblogs.com/yangyanfei/p/6386831.html
Copyright © 2011-2022 走看看