zoukankan      html  css  js  c++  java
  • Linux 脚本设计3——三种流程控制语句(顺序语句、分支语句、循环语句)

    1.Linux流程控制语句                                              

      控制语句就是控制语句往哪走怎么走,linux控制语句与其他语言一样有三种:条件语句,分支语句和循环语句,这三种语句也反应了现实中的逻辑。

    1.1条件语句                           

    if,if else,if elif语句

    上述都用fi结束

    条件语句:先进行逻辑条件判断,再决定程序执行哪一种情况

    表示逻辑条件有如下方式:

    1、  单一变量

    2、  表达式

    注意:每一个if(包括elif)后面都要有一个then,并且最后以fi结束

    1.1.1 if语句使用语法

    if [condition]
    
      then
    
          instruction
    
    fi

    1.1.2 if…else 语句使用语法

    if [condition]
    
     then
    
       instruction
    
    else
    
       instruction
    
    fi

    1.1.3 if …elif语句使用语法

    if [condition1]
    
      then
    
          instruction1
    
    elif[condition2]
    
      then
    
          instruction2
    
    fi

    上述三种if语句的使用区别:

    处理能力

    A:if…then…fi处理能力最末

    B:if…then…else…fi处理能力次之

    C:if…then …elif...then…elif…then…elif…then fi的处理能力最强

    说明:

    A只能处理一种情况,如果条件满足,就处理,如果不满足,不做任何处理,就是不输出别的信息到屏幕或文件,因为C只有一种分支。

    B只能处理两种情况,一种是if后面的,一种是除了if以外的所有情况,也就是if条件的补集对应的情况都用else表示了

    C的处理和java中的switch语句是一样的,假设一个问题有10种情况,那么第一个if代表一种情况,其他的9个elif,每一个elif代表一种情况,共计9种

    #!/bin/bash
    
    echo "Input your mark"
    
    read mark
    
    if [ $mark -gt 90 ]
    
       then
    
            echo "Talent"
    
    fi
    #!/bin/bash
    
    echo "Input your mark"
    
    read mark
    
    if [ $mark -gt 90 ]
    
       then
    
            echo "Talent"
    
    else
    
            echo "failed"
    
    fi
    #!/bin/bash
    
    echo "Input your mark [0,100]:"
    
    read mark
    
    if [ $mark -ge 0 ] && [ $mark -lt 60 ]
    
       then
    
            echo "You'd better prepare to review your lesson for makeup"
    
    elif [ $mark -eq 60 ]
    
       then
    
            echo "one more is waste,one less is hard,60 is your god"
    
    elif [ $mark -gt 60 ] && [ $mark -lt 70 ]
    
       then
    
            echo "Qualified and Eligible"
    
    elif [ $mark -ge 70 ] && [ $mark -lt 80 ]
    
       then
    
            echo "Nice"
    
    elif [ $mark -ge 80 ] && [ $mark -lt 90 ]
    
       then
    
            echo "Excelent"
    
    elif [ $mark -ge 90 ] && [ $mark -le 100 ]
    
       then
    
            echo "Talent"
    
    elif [ $mark -lt 0 ]
    
       then
    
            echo "Input the right format mark"
    
    fi

    1.2 case语句                        

    本章包括

    1、使用case语句

    2、使程序至少程序一条case语句

    3、case语句在用户界面中的作用

    前面已经知道if条件句的三种情况,已经说明了方法C的处理和case是等价的。由于C可读性较差,用case则显得清晰的多。介绍case语句。

    case的使用语法

    case $变量名 in
    
    变量值1)
    
             处理语句(不包含分号)
    
    ;;
    
    变量值2)
    
             处理语句(不包含分号)
    
    ;;
    
    ….
    
    *)
    
             处理语句(不含分号)
    
    //没有分号
    
    esac

    说明:

    1、变量值就是变量名能取到的所有条件,变量值可以是一个单值,也可以是一个区间

    每一个逻辑分支的处理语句不包含分号,但是逻辑分支下面包含两个分号

    2、最后以esac结束,作为结束关键词。

    3、case后面的变量名带有in关键字,表示变量名在如下的变量值中

    4、变量值后面跟一个小括号).

    5、无论什么时候引用某个变量,必须加上美元符号$

    6、如果不能匹配所列的值,使用通配符*放在变量值的最后位置,加上一个),然后方式处理语句,注意通配符*)的处理语句下面是没有两个分号的。切记*是通配所有情况的,如果把*)放在第一个逻辑分支,那么它将会覆盖后面的所有分支,也就是说此时的case语句相当于只有一个逻辑分支,这个逻辑分支是*)的,它已经覆盖了后面的所有逻辑分支。

    case语句在用户界面的作用

    由于linux shell与用户的交互并不是像windows那样有个图形界面的对话框,而是使用一种字符菜单形式与用户交互,因此,每一种情况可以用case来处理。

    将菜单与case的分支进行对应就可以建立linux程序的菜单处理。

    语句的嵌套

      在上述提到的if及case语句中,每一个instruction都可以用一个更小的if及case程序模块来代替,这种情况就是语句的嵌套。

    1.3 linux循环控制语句          

    while循环使用语法

    while(condition)
    
             do
    
                       instruction
    
    done

    注意:这个循环的的终结词是用done,而且多了do,这些与C的循环是有区别的。

    可以将循环用于菜单、计时循环的设计

    死循环:while循环条件永远为真,程序永不停止(程序执行外在环境没有受影响的条件下)的执行循环体,永远不会停止执行,这种循环称为死循环。

    for in循环

    使用语法:

    for 变量名 in 取值列表
    
    do  
    
             instruction
    
    done

    注意这里的变量名不需要加上双引号,取值列表用空格隔开

    这个循环的含义是:变量名取取值列表中的每一个值后,然后执行循环体,取值列表有100个值,则执行循环列表一百次。

    例如

    #!/bin/bash
    
    for name in hola hello bonjour
    
        do
    
            echo "Buenas noches,$name !"
    
    done
    
     
    
    Buenas noches,hola !
    
    Buenas noches,hello !
    
    Buenas noches,bonjour !

    这里面name取了取值列表的每一个值,然后执行循环体

    变量值表也称为单词表,如果变量值中含有空格符合,需用双引号括起来,变量值之间仍然用空格隔开,变量值中没有双引号的不需要用双引号,有双引号的单词和没有双引号的单词可以放在一起。

    #!/bin/bash
    
    #declare name="hola"
    
    for name in "hola holala" hello bonjour
    
        do
    
            echo "Buenas noches,$name !"
    
    done

    1.4 循环嵌套和快速退出         

    嵌套循环,一个循环内部包含别的循环,换种说法也就是一个循环外还有循环,循环是多层的。

    写循环嵌套时候,必须注意的是while和for in两种循环do 和done都是配套的。

    中止循环

    break循环用于跳出一个循环设计的所有次循环,continue用于跳出一次循环,通常continue放的位置并非循环体的最后位置,这样跳出这次循环后就不用执行continue语句后的其他语句。

    注意使用赋值语句:

    let a = “$a + 1”,这里面左边的变量没有美元符号,右边有,右边的双引号可以有,也可以没有

    while循环条件中括号与变量要隔开,引用变量时候可以用双引号也可以不用,但是需要用美元符号,for in循环中,变量不需要美元符号。

    2.函数                                                                       

    一段功能单一的函数可以成为子程序,一个代码文件里面通常可以包含几个函数,但是只有一个主函数,也就是一个主函数和其他几个附属函数构成一个相对完善的功能。

    函数:

    函数的定义语法:

    使用关键字

    function  函数名
    
    {
    
    语句
    
    }

    注意:1、shell里面的大括号放的位置不像java里面放的那样,第一个大括号紧靠在函数名外面,必须另起一行开始放。

    2、只有一个函数而不调用函数,即:不在某一行中写改函数名,是不执行定义的函数里面的语句的。如

    #!/bin/bash
    
    clear
    
    function hola
    
    {
    
    echo "hello world"
    
    }

    hola

    如果没有加粗的hola函数调用,虽然定义了hola函数,但是是不执行的。调用才执行。

    2.1 函数的传参                     

    位置参数:在shell语言中,使用$1表示第一个参数,$2表示第二个参数,以此类推,$0表示程序名称。$表示变量的引用,不能用其他字符如val等类似变量名称的字符来代替这些数字,这与java是有不同的。

    #!/bin/bash
    
    clear
    
    function verify
    
    {
    
    if [ $1 -eq 747787 ]&&[ $2 -eq 1234 ]
    
       then
    
            echo "Verified"
    
       else
    
            echo "Not Verified"
    
    fi
    
    }
    
    echo "Input your name"
    
    read name
    
    echo "Input your password"
    
    read password
    
    verify $name $password

    符号$#表示的意思是传递的参数个数,可以用参数个数校验的方法来确定是否去调用某个函数

    函数的共用

    函数的共用就是把一个函数变成一个公共的函数,这样大家都能调用,使用关键字export

    语法:export 函数名

    函数的返回值:使用return关键词 return 可以设定返回一个数表示一段程序执行的结果,这个数是0——256,不能返回字符串。通常用返回0表示返回正常,返回非0表示返回错误的结果。返回的结果存放在变量$?中,可以用于case语句的处理。

    3.数据文件程序的设计与打印                                         

    两个符号:

    1.>   重定向符号,这个符号前面已经说了,就是讲信息写入重定向符号右边的文件中,覆盖原文件信息内容。

    2.>> 也是重定向符号,它是添加到文件末尾的符号,并不覆盖。

    利用gawk查找文件中的信息

    搜索语法

    gawk ‘/ABC/{print $1,$2….$N}‘ 文件名

    注意:

    1.ABC是表示要搜索的内容,用两个正斜杠/包着

    2.文件名表示要在其中搜索的文件,需要与最后一个单引号隔开

    3.总的来说这个搜索表达式包括三个部分 gawk  正则表达式 文件名,正则表达式用单引号包着,与其他两个部分隔开。

    这个搜索表达式默认是首列进行匹配的,也可以进行指定列的匹配

    gawk  ‘$N~/^123*/{print $1,$2….$n}’ 文件名

    $N表示对指定的列进行匹配,~表示匹配一个搜索表达式,如果是!~表示不匹配一个搜索表达式,找出不等于搜索表达式的记录。^表示进行一个列的开头进行匹配,*是通配符。

    上述搜索命令右方加上>可以讲搜索到的内容重定向到一个文件中。这样就可以搜索到想要的,把不想要的过滤掉,也就相当于删除了不想要的内容。

    打印内容:

    lp命令,利用lp命令可以调用打印程序,将内容送到已经安装好的打印机中,进行打印

    cat abc | lp,其中|是管道符号

    管道符号与重定向符号的区别:

    管道符号|与重定向符号>或>>区别是管道符号两边都是命令,它的本质是将一个命令的输出当作另一个命令的输入,而重定向符号左边是命令的输出,右边是文件,也就是输出的最终地址。

    现在有这样的问题:搜索满足某个条件的信息,然后打印。可以这样做使用gawk来搜索,然后利用管道命令,将输出结果输送到打印机,即lp命令,也就是:

    gawk 正则表达式 文件名 | lp

    这样写有一个问题,就是每搜索一个结果就送到打印机,这样就需要反复执行gawk命令,这样做效率很低。可以先把搜索结果放在一个文件中,然后将整个文件送去打印。

    gawk 正则表达式 文件名>新文件名

    cat 新文件名|lp

    这样会提高效率。

    注释:

    注释用于解释一个程序的目的或者某一个函数的用途,对于函数的注释无须多说,对于一个程序文件的注释,通常放在程序的开头,并且一个程序的注释至少包含如下7个部分。

    #程序名称(就是程序文件的名称)
    
    #程序的功能
    
    #程序员的名称
    
    #使用程序的潜在用户
    
    #程序的设计日期
    
    #程序最后一次修改日期
    
    #最后一位修改的程序员名字
    
    例如:
    
    #Title:ForInDemo
    
    #Purpose:a demo to show how to use for in sentence
    
    #Programer:Jack Ren
    
    #Primary User:programer
    
    #Originally Written:13/04/13
    
    #Last Changed:13/04/13
    
    #Changed by:Jack Ren
    
    注释使用#符号,也可以把这个#放在一个语句的开头,使语句失效

    4.email程序设计                                                    

    使用linux email邮件

    每一台linux机器上都有一个linux账号,账号与主机名组合就是该email的账号。

    比如说linux机器名是Landau,有一个linux账号是qq,那么该主机上的邮件账号是qq@Landau。

    Linux email的邮件程序是mail

    使用语法:mail 邮件地址 < 发送的内容文件

    可以携带参数

    -s  表示邮件的主题     mail –s “关于神经网络系统的设计” qq@Landau < neutralnetsystemdesign.txt

    -c   表示明抄送,就是大家都可以看到的抄送地址 如果不带这个参数,发送给多个人时候,需要将邮件地址以空格隔开。 mail –c qq@Landau bob@Landau < 发送的内容文件,不带-c,所有人都在目的地址中,带-c,-c后面的人在抄送列表中,邮件的收件人可以看到所有的地址。

    -b  表示密送,密送地址可以看到所有明送的抄送地址,但是看不到其他密送的地址。

    mail –b qq@Landau < 发送的内容文件

    三个参数可以同时使用,参数的作用范围,如果参数不冲突,则一直到邮件地址结束,如果有冲突,则到下一个参数开始前为止

    Mail –s “你好” –c qq@Landau –b bob@Landau < nihao.txt

    一个统计写的程序有多少行的程序代码

    cat * >abc.txt

    :set nu

    就可以看到代码多少行了

    5.一些有用的linux shell程序                                     

    spell 拼写检查程序,能够对作用的文本内容进行检查

    比如spell abc.txt,如果abc.txt中有错误的单词,将检查出来

    spell的作用原理是将文本的单词与linux字典中的文件进行比较,如果字典中没有这个单词,那么就会显示出来,这其实是个缺陷,因为像地方名称、名字这些东西很可能不在linux字典文件中。

    排序:sort

    使用语法:sort abc.txt

    sort默认的排序是升序。并且小写在大写前面,几个参数

    -r reduce 表示降序

    -f 表示忽略大小写

    -n number 按照首字母数字排序

    -m month 按照月份排序

    比较文件差异:diff

    diff file1 file2
    
    hadoop@sdp15:~> diff hello.txt hello.sh
    
    1,5c1,6
    
    < 2Hello
    
    < 1hola
    
    < 4hello
    
    < hello123
    
    < hello1234
    
    ---
    
    > #!/bin/bash
    
    > clear
    
    > echo"Welcome to my first linux program"
    
    > echo"Enter your first name"
    
    > read response
    
    > echo "Hello

    其中<表示只在file1中有的,>表示只在file2中有的,没有显示的表示是共同有的。

    比较程序cmp

    这个程序会比较每一个字符,与diff都是比较,但是比较的比较细致。

    对大型文件的修改:sed程序

    一般的文件编辑器工作是这样的,它将整个文件读入到系统的缓冲区,然后进行操作,如果文件太大,那么整个缓冲区将没法装下这个文件,也就无法继续操作。sed的工作原理不同,每次只读入一行数据,然后保存文件到一个后缀名为.tmp(其实任何一种后缀名都是可以的,后缀名其实没啥用,有没有都一样的,只是一种类型标识而已)中,而不是原文件中。这样可以先用sed修改文件,然后保存到原文件.tmp中,最后用mv命令修改原文件.tmp为原文件名称即可(会自动替换原文件的)

    语法:

    sed 正则表达式 原始文件 > 一个tmp文件中

    重命名tmp文件

    拆分大型文件split

    语法:split –n filename

    -n代表每一个文件行数,最后一个文件可能没有这么多行,就相当于一个除法一样,最后一个文件如果不是-n行数,就以余数行数为内容。拆开后的小文件以xaa,xab,xac。。。类推命名。split一个文件后,原文件依然存在而不被删除。

    查找文件中的字符

    grep命令

    使用语法:grep 查找的内容 文件名

    如果不确定在哪个文件,可以使用*进行通配

    ftp命令 远程登录

    使用语法:ftp  IP地址

    输入后提示用户输入账号和密码,正确后就可以登录

    注意:ftp支持的linux命令并不是和linux本机完全一致的,比如说ll在suse linux中可以用,但是在ftp模式下,用ll是无效的,可以用ls。

    用ftp获取文件

    ftp> get 文件名

    获取的文件在当前本机的目录下

    传递文件到对方机器上

    使用命令

    ftp>put 文件名

    这时候文件就被传送到对方机器当前目录下

    断开链接:直接输入bye即ftp>bye 即可

    剪切 文件中的列

    使用命令cut

    cut –f 1,2(1,2表示列) 作用的文件名 > 剪切的列放置到新的文件中,如果不用重定向符号>此时会将剪切的在屏幕中显示

    注意:linux命令是通过一个tab键来确定两个字符串之间是否是列的关系,如果两个字符串之间是一个空格,系统会认为是一列的。例如

    Jim Green是一个field,而Jim      Green是两个fields

    注意:每次启动一个程序时候都会启动一个shell

    修改文件中的字符

    命令tr

    tr 正则表达式 <原始文件名>目的文件名

    注意用了重定向符号

  • 相关阅读:
    第二次作业
    大学——新生活方式
    第四次作业
    第三次作业
    第二次作业——起航
    梦开始的地方
    第四次作业
    第三次作业
    第二次作业
    博客作业 随笔
  • 原文地址:https://www.cnblogs.com/people/p/3017083.html
Copyright © 2011-2022 走看看