zoukankan      html  css  js  c++  java
  • linux之shell编程(二)

    今天给大家继续来分析linux下的shell编程,在上一篇文章简单的介绍了shell编程到底是什么,以及它的一些基本使用规则。我们今天主要来分享shell编程中的一些其他用法,比如说:条件语句,循环语句等;好了下面就开始我我们今天的内容了:

    一、shell中的变量定义和引用:

    1、变量定义和初始化:shell是弱类型语言(语言中的变量如果有明确的类型则属于强类型语言;变量没有明确类型就是弱类型语言),和C、C++语言不同。在shell编程中定义变量不需要制定类型,也没有类型这个概念。

    2、变量定义时可以初始化,使用=进行初始化赋值。在shell中赋值的=两边是不能有空格的。同时要注意:shell对语法非常在意,非常严格。很多地方空格都是必须没有或者必须有,而且不能随意有没有空格。

    3、变量赋值,变量定义后可以再次赋值,新的赋值会覆盖老的赋值。shell中并不刻意区分变量的定义和赋值,反正每个变量就是一个符号,这个符号的值就是最后一个给他赋值时的值。

    4、变量引用。shell中引用一个变量必须使用符号,符号就是变量解引用符号。基于上面的理论,我们现在来实战演示:

       #!/bin/bash
       string="I love shell"
       echo $string
    

    演示结果:

      root@txp-virtual-machine:/home/txp# source test.sh
      I love shell
    

    这里同时也演示一下在变量定义的时候,不要有空格错误演示:

      #!/bin/bash
      string ="I love shell"
      echo $string
    

    演示结果,你将会看到下面这样的错误提示,虽然最终可以打印出来我们想要的结果,但是我们作为程序员一枚,自然是要做到—— 0 error , 0 warning

      root@txp-virtual-machine:/home/txp# source test.sh
      No command 'string' found, did you mean:
      Command 'strings' from package 'binutils' (main)
      Command 'strings' from package 'binutils-multiarch' (main)
      Command 'spring' from package 'spring' (universe)
      string: command not found
      I love shell
    

    扩展总结:

    a、$符号后面跟一个字符串,这个字符串就会被当作变量去解析。如果这个字符串本身没有定义,执行时并不会报错,而是把这个变量解析为空。也就是说在shell中没有被定义的变量其实就相当于是一个定义并赋值为空的变量。

    b、变量引用的时候可以var,也可以{var}。这两种的区别是在某些情况下只能用{var}而不能简单的var。

    c、还是主要在给变量赋值的时候不要在“=”与变量符号和所赋的值之间留空格,可能刚开始大家有点不习惯这种风格,比较在c和c++里面写代码,留空格,是一种代码风格,日后别人去看代码,看着也舒适;总之还是那句话,习惯了就好,毕竟规则是这么定的。

    二、shell中调用linux命令:

    有的时候,你不想输入太多的命令,可以在写一个shell脚本,把你要写的命令操作全部写进去,然后一键操作猛如虎,哈哈,于是乎,这里就出现了在shell脚本中使用命令两种目的:

    1、直接执行:

    这里我演示一下,我查看当前目录下有什么文件,我只要在shell脚本里面输入一个ls命令就行,具体看下面演示:

    #!/bin/bash
    ls
    

    然后我们只要执行这个脚本文件就能实现我的功能了,这里只是简单的演示,有的时候写脚本对我们帮助非常大,可以提高我们的工作效率:

    root@txp-virtual-machine:/home/txp# source test.sh
    1    2.c    Desktop    Downloads         fun.sh  hello.c         linux-2.6.35.7.tar.gz    Music     Public     Templates  test.sh  Videos
    1.c  a.out  Documents  examples.desktop  h.c     linux-2.6.35.7  linux-2.6.35.7.tar.gz.1  Pictures  return.sh  test       test.sj  vmware-tools-distrib
    
    

    2、反引号括起来执行。有时候我们在shell中调用linux命令是为了得到这个命令的返回值(结果值),这时候就适合用一对反引号(键盘上ESC按键下面的那个按键,和~在一个按键上)来调用执行命令:

    #!/bin/bash
    PWD=`pwd`
    echo $PWD
    

    这里演示的结果是使用pwd命令用于显示用户当前所处的工作目录:

    root@txp-virtual-machine:pwd# source test.sh
    /home/txp
    

    三、shell中的选择分支结构:

    看到选择分支结构,大家应该都比较熟悉,第一反应就会想到if条件语句,没错就是它;在学习c、c++语言的时候,if条件语句对你来说简直小菜一碟,但是shell中的格式跟我们c、c++中的不一样,不过在掌握shell中的书写格式后,因为写法思想和之前的一样,只是说换了一种形式而已,俗话说的好:“换汤不换药”,同样对你来说是小菜一碟。

    1、条件测试语句类型:

    文件测试语句
    逻辑测试语句
    整数值比较语句
    字符串比较语句
    

    a、在这些语句中我们有的时候看别人脚本的时候,也经常会看到,因此我们必须掌握,日后也方便自己来写shell脚本,下面是文件测试中常见遇到的参数类型汇总:

    操作符作用
    -d 测试文件是否为目录类型
    -e 测试文件是否存在
    -f 判断是否为一般文件
    -r 测试当前用户是否有权限读取
    -w 测试当前用户是否有权限写入
    -x 测试当前用户是否有执行权限执行

    b、逻辑测试语符号(这个比较简单,对于我们做嵌入式的,在c语言里面就已经掌握了非常好了):

    这里用的比较多是逻辑与:&&(它表示当前面的命令执行成功后才会执行它后面的命令)

    还有一个就是逻辑或:||(表示当前面的命令执行失败后才会执行它后面的命令)

    最后一种就是逻辑非:!(它表示把条件测试中的判断结果取相反值。也就是说,如果原本测试的结果是正确的,则将其变成错误的;原本测试错误的结果则将其变成正确的)

    c、整数比较运算符汇总:

    操作符作用
    -eq 是否等于
    -ne 是否不等于
    -gt 是否大于
    -lt 是否小于
    -le 是否等于或小于
    -ge 是否大于或等于

    d、字符比较运算符汇总:

    操作符作用
    = 比较字符串内容是否相同
    != 比较字符串内容是否不同
    -z 判断字符串内容是否为空

    2、if语句的三种格式书写:

    a、单分支结构:

    if 条件测试操作
       then  命令序列
    fi
    

    b、双分支结构:

    if 条件测试操作
       then  命令序列1
       else  命令序列2
    fi
    

    c、多分支结构:

    if 条件测试擦做1
       then 命令序列1
    elif 条件测试操作2
       then 命令序列2
    else
        命令序列3
    fi
    

    3、实战演示:

    判断文件是否存在,不存在的话,就创建一个这样的文件:

    #!/bin/bash
    if [ -f a.c ]
       then echo "yes"
    else
       echo "no"
       touch a.c
    fi
    
    

    演示结果:

    root@txp-virtual-machine:/home/txp# source test.sh
    no
    root@txp-virtual-machine:/home/txp# ls
    a.c 
    

    判断目录文件是否存在 ,这里我就以上面是否存在/hoem/txp这个目录类型的文件来演示了:

    #!/bin/bash
    [ -d /home/txp ]
    echo $?
    

    演示结果,这里注意通过Shell解释器的内设$?变量显示上一条命令执行后的返回值。如果返回值为0,则目录存在;如果返回值为非零的值,则意味着目录不存在:

    root@txp-virtual-machine:/home/txp# source test.sh
    0
    

    判断字符串是否相等:

    #!/bin/bash
    if [ "abc" = "abc" ]
       then  echo  "equal"
    else
        echo "not equal"
    fi
    

    演示结果:

    root@txp-virtual-machine:/home/txp# source test.sh
    equal
    

    用"-o"来演示逻辑或的使用:

    #!/bin/bash
    if [ 12 -eq 12 -o "abc" = "abc" ]
       then  echo  "yes"
    else
        echo "not"
    fi
    

    演示结果:

    root@txp-virtual-machine:/home/txp# source test.sh
    yes
    

    判断字符串是否为空:

    #!/bin/bash
    str=""
    [ -z $str ] && echo "yes"
    

    演示结果:

    root@txp-virtual-machine:/home/txp# source test.sh
    yes
    

    四、总结;

    限于篇幅原因,暂时就没有写for和while等循环结构了,而且上面注意一个地方就是在往[]里面写判断语句的时候,注意左右两边要有空格,同时if语句的多分支结构我没有举例子,因为这和c语言里一样,只是说书写形式稍微有点不一样,下一篇文章继续分享。如果有想深入学习shell编程的网友,可以在公众台回复shell,就有两份shell电子书免费送给大家,希望对大家在学习上有帮助。

    如果各位喜欢的我的文章,可以在下方点个在看(或者转发也行),你的支持,就是我写文分享最大的动力,感谢您的支持。不忘初心,方得始终。可以关注公众号----TXP嵌入式

  • 相关阅读:
    WEB API 系列(二) Filter的使用以及执行顺序
    C# 各个版本特征
    dapper使用
    windows设置自动清理log
    [Mime] MimeReader--读取Mime的帮助类 (转载)
    [Mime] MimeHeaders--MimeHeader帮助类 (转载)
    [Mime] MimeEntity--MimeEntity Mime实体帮助类 (转载)
    [Mime] MediaTypes--电子邮件类型类 (转载)
    [Json] C#ConvertJson|List转成Json|对象|集合|DataSet|DataTable|DataReader转成Json (转载)
    [功能帮助类] JsHelper--Javascript操作帮助类 (转载)
  • 原文地址:https://www.cnblogs.com/1121518wo/p/12814053.html
Copyright © 2011-2022 走看看