知识点七 shell脚本

什么是shell script
    1、什么是shell
    shell是一个在操作系统之上的软件,linux登录后默认就进入这个软件
    shell是一个命令的解释器,能解析用户所输入的命令 (ls cp rm pwd 等等)
    shell拥有自己内建的命令集
    2、bash
    bash(Bourne Again shell )是shell的扩展,并且完全兼容shell(类似vim与vi的关系)
    3、什么是shell script
    Shell脚本是利用 shell 的功能所写的一个程序,将一些shell的语法与命令(含外部命令)写在
    里面, 搭配管道与数据重定向等功能,以达到我们所想要的功能。
    4、解释型语言与编译型语言
    shell脚本是解释型语言,执行时是逐条解释你写的程序来运行。(python)
    而编译型语言需要先通过编译器进行编译,把代码翻译成机器能识别的指令,然后再运行(C++)
第一个shell script
    第一步:使用文本编辑器(vim)来创建文本文件(一般以.sh结尾)

    第一行必须包括shell声明:#!
     #!/bin/bash       (告诉系统执行的时候要调用什么解释器)
     #开头的是shell的注释
    第二步:输入命令 echo “hello world”
    第三步:给文件添加执行权限     chmod 755 hello.sh
    第四步 运行脚本
          第一种方式:指定脚本的绝对或相对路径来运行   ./hello.sh
          第二种方式:直接运行解释器,将脚本作为参数运行 sh hello.sh
    常见问题
        -bash: ./hello.sh: Permission denied     没有赋予执行权限
shell变量、赋值
    一、变量
        变量以字母或者下划线开头,后面接任意长度的字母、数字和下划线,如 var=linux 
        变量的引用需要在前面加$符号 ,如echo “$var”
        如果变量的值中间有空格,需要用双引号引起来,如var=“hello world”
        单引号、双引号的区别?
    二、特殊变量
        位置参数  $n ,n为数字,$0为命令本身,$1-$9是命令行第一道第9个参数
        $*  代表所有参数
        $# 代表参数的个数
        $?  代表上一个命令的返回状态
    三、命令替换和赋值
        命令替换的格式: $(cmd) 或者 `cmd`  # ``为tab上的反引号
        在执行命令的时候,会先将$(cmd) 或者 `cmd` 里的命令先执行一遍,再将结果返回到原来的命令中
        var=$(uname -a)
        echo $var
        命令替换和管道的区别?
        命令替换是将一个命令的输出作为另外一个命令的参数,而管道是将命令的输出作为下一个命令的标准输入
         如 date +%Y|touch
            touch $(date +%Y)
    四、算数运算和赋值
  
        首先,echo 1+2,没有输出3。因为shell需要特殊的格式来进行算数运算

         方式一   ((i=$j+$k))
         方式二   let i=$j+$k
        赋值  
        var=$(($i+$j))
        echo $var
        五、多个命令分隔符
               分号(;)是shell的命令分隔符, 让同一行的命令能够顺序执行。如echo 1 ;echo 2
shell中控制结构
         上述脚本有什么问题?如果目录创建失败或目录创建成功但文件拷贝失败会如何? 会导致文件没有备份就被删除。因此需要在命令执行前做逻辑判断,根据上次命令的不同的执行状态, 来采取不同的操作。这里大概就会分为两类:
1、条件判断,基于各种条件,进行后续相应操作 2、循环控制
if语句和test命令
    一、if 判断
    在shell中if条件判断语句和我们的C、python等语言不同,
    shell的if语句条件必须用[ ]括起来,另外[ ]里外都需要用空格与周围隔开(例如[ a == b ]),否则会报错
    if基本语法  
        if [ 表达式 ];then    ;fi
        或
        if command;then ;fi
    其中[ 表达式 ] 等同于test命令,man test
    二、条件测试类型
        整数测试
         -eq 测试两个整数是否相等
         -ne 测试两个整数是否不等
         -gt 测试一个数是否大于另一个数
         -lt 测试一个数是否小于另一个数
         -ge 大于或等于
         -le 小于或等于  
        字符串测试(两边要有空格)
          == 等于  
          != 不等
          >  大于
          <  小于
          -z string 测试指定字符是否为空,空着真,非空为假
         -n string 测试指定字符串是否为不空,空为假 非空为真

       文件测试
        -e FILE 测试文件是否存在
       -f file 测试文件是否为普通文件
       -d file 测试指定路径是否为目录
       -r file 测试文件对当前用户是否可读
       -w file 测试文件对当前用户是否可写
       -x file 测试文件对当前用户是都可执行

       组合测试
         -a: and
          -o: or
            !: 非
shell中&&和||的使用方法
    一、&&运算符:
    command1  && command2
    &&左边的命令(命令1)返回真(即返回0,成功被执行)后,&&右边的命令
        (命令2)才能够被执行;命令之间使用 && 连接,实现逻辑与的功能。
    如test -f /var/log/messages && echo ok
    二、||运算符:
    command1 || command2
    ||则与&&相反。如果||左边的命令未执行成功,那么||右边的命令就会执行
    如 test -f 123 || echo error
for循环语法
    一、for循环
    for arg in [list]
    do
       command…
    done

    list列表可以是空格分割的字符串,也可以是命令替换返回的结果
    如
    for v in /etc/sudoers /etc/resolv.conf 
    do ls -l  $v
    done
    1、请用for创建100个文件,文件名为ps1-ps100
    2、请用for把ps1-ps100,分别创建100个tar包,命名为ps1.tar-ps100.tar
while循环语法

二、while循环
    while [condition]
    do 
      command... 
    done

    输入名字 打印一个随机数字
    while read -p "please input a name" name; 
    do    
       echo $name $RANDOM; 
    done
shell函数
    格式
    function name ()
    {

    }
    shell函数可以带function关键字,也可以不带
    shell函数内可以加return返回值,也可以不带,如果不带就以最后一条命令运行结果,作为返回值。
    例如
    demoFun(){
        echo "这是我的第一个 shell 函数!"
    }
    echo "-----函数开始执行-----"
    demoFun
    echo "-----函数执行完毕-----"

 

posted @ 2018-06-23 17:09  liang哥哥  阅读(136)  评论(0)    收藏  举报