美文网首页Chipseq Shell学习
Shell脚本语言学习一

Shell脚本语言学习一

作者: SimpleBK | 来源:发表于2017-11-16 18:09 被阅读0次

    Shell脚本语言学习二
    Shell脚本语言学习三


    首先 进行基本的文件创建,以及权限查询修改等

    • 进入Mac终端在桌面创建文件

      终端命令:
      bogon:~ junde$ cd Desktop/
      bogon:Desktop junde$ touch shell.sh
      
    • 查询文件权限

      终端命令: 
      bogon:Desktop junde$ ls -l shell.sh
      输出结果:
      -rw-r--r--  1 junde  staff  0 11 16 17:07 shell.sh
      解释: r, w, x 分别代表读,写,执行 三种权限
           第一个 '-' 代表类型,通常文件都是'-'.当然还有其他类型,比如d表示目录等
           接下来 'rw-'  代表当前用户的权限,即属主权限
           再接下来 'r--'  代表当前用户所在组的成员对该文件的权限,即属组权限
           最后3个字符是r--,代表其他用户权限表示该文件对于其他用户来说也是只能读,不能写和执行。
           如果权限后面跟的有 '@' 这是mac系统的文件自带的一个表示文件有扩展属性的标示,与权限无关。 
           紧接着 '1' , number,即文件inode数量,inode表示储存文件元信息的区域
           然后 'junde' , 即 user,即当前用户名
           然后 'staff', 即 group,即当前用户所在的组的名字
           然后 '0' , 即 filesize,即该文件大小,单位是byte
           接着是修改时间: 11月16号17时07分
           最后是文件名称
      
    • 修改文件权限
      命令以及格式如下

      修改权限的命令格式 
      chmod [<权限范围><权限操作><具体权限>] [文件或目录…]
      
      <权限范围> 
      u:User,即文件或目录的拥有者。 
      g:Group,即文件或目录的所属群组。 
      o:Other,除了文件或目录拥有者或所属群组之外,其他用户皆属于这个范围。 
      a:All,即全部的用户,包含拥有者,所属群组以及其他用户。
      
      <权限操作> 
      +:表示增加权限 
      -:表示取消权限 
      =:表示唯一设定权限
      
      <具体权限> 
      r:表示可读取 
      w:表示可写入 
      x :表示可执行
      

      案例需求

      将当前用户增加执行权限
      命令:
      bogon:Desktop junde$ chmod u+x shell.sh 
      
      再次查看文件权限是否更改
      命令:
      bogon:Desktop junde$ ls -l shell.sh 
      输出结果
      -rwxr--r--  1 junde  staff  0 11 16 17:07 shell.sh
      

      通过上述操作我们就成功的给当前用户添加了对该文件的执行权限.


    其次 Shell环境介绍

    • Mac环境支持Shell开发
    • Shell中类非常多
      Bash是所有的操作系统默认脚本语言(免费、易用)
      种类:bash、c Shell、K Shell等等...

    最后 开始Shell语言的基础学习

    以下都是使用Shell语言写在shell.sh文件中的脚本代码
    在终端中执行这个脚本文件命令: ./shell.sh 而不是shell.sh 运行其它二进制的程序也一样,直接写 shell.sh,linux 系统会去 PATH 里寻找有没有叫 shell.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 shell.sh 是会找不到要执行的脚本文件的,也就执行不了文件中的命令,要用 ./shell.sh (文件名前加上./) 告诉系统说,就在当前目录找。

    • 第一个Shell程序

      脚本代码
          #!/bin/bash
          echo "Hello world!"
      解释:
          #! 表示约定标记,它告诉系统这个脚本需要什么解释器来执行,即是一种脚本体现
          echo:表示命令用于输出文本信息
          # 表示注释, 只有单行注释,如需要注释上面的输出文件命令行只需要前面加# `#echo "Hello world!"`  
      终端执行输出结果             
           Hello world!
      
    • Shell脚本语言->变量

      1> 定义变量注意事项:

      • 注意事项一, 定义变量时候,变量名处不需要加"$"符号

      • 注意事项二, 变量名中间不允许有空格

      • 注意事项三, 变量名和等号不能够有空格(和我们的一般语言不一样)

        正确写法:
            name="smile2017"
        错误写法:(报错 ./shell.sh: line 13: name: command not found)
            name ="smile2017"
        
      • 注意事项四, 变量名首字母必需是字母或者+下划线也可以(a-z、A-Z)

        正确
        age=100
        _age=100
        echo $变量名 可以输出变量值, 即 echo $age 或者 echo $_age 值都是100
        
      • 注意事项五, 不允许使用标点符号

        #错误写法
        na,me="simle2017"
        

    2> 只读变量 -> 类似于通常所讲解常量

    关键字:readonly(只读,不能够修改)
    脚本代码:
           name="HelloApp"
           readonly name
    如果后面还有脚本代码给 name 赋值,   
           eg: name="hehe"
           echo $name
    则终端执行文件输出的值还是 'HelloApp', 并且会出现报错 './shell.sh: line 10: name: readonly variable'
    

    3> 将变量删除

    语法:unset(干掉了)
    案例:unset 变量名
    脚本代码:
          name="Andy"
          echo $name
          unset name
          echo $name
    第一个输出的值 Andy, 第二个输出的值为空, 如果先将变量用 readonly 修饰,也是删除不了的.
    

    4> 变量类型

    类型一: 本地变量     
    作用域: 整个bash进程都可以使用
    语法(直接写的形式): name="bash"
    
    类型二: 局部变量
    作用域: 当前代码段
    修饰符: local
    语法: local name="Andy"
    
    类型三: 环境变量
    作用域:当前shell进程以及子进程
    语法:export name="Dream"
    
    类型四: 位置变量
    脚本代码:
         fileName=${0}
         name=${1}
         age=${2}
         sex=${3}
         echo "姓名:${name} 年龄:${age} 性别:${sex}"
    终端执行命令:
        ./shell.sh andy  18  男
    回车输出:
        姓名:andy 年龄:18 性别:男
    说明: 
        ${0}表示脚本文件名称
        参数从1开始
    
    类型五: 特殊变量
        $0 是特殊变量,表示文件名称
        $? 也是特殊变量,表示返回上一个命令的执行状态返回值
            0:表示执行成功
            1:程序执行结果
            2:表示程序状态返回码(0-255)
            系统预留错误(1、2、127)
        $# 表示当前截止的脚本文件的参数个数
        $* 表示参数列表,将所有的参数列表组成一个字符串
        $@ 表示参数列表,各个参数是分开的
        $$ 表示当前Shell进程的ID
        $! 表示执行的上一个指令的PID(Progress ID),也就是Shell最后运行的后台Process的PID
    脚本代码:
          echo ${0}
          echo ${?}
          echo ${#}
          echo ${*}
          echo ${@}
          echo ${$}
          echo ${!}
    终端执行命令:
          ./shell.sh andy 18 男
    输出结果:
          ./shell.sh
          0
          3
          andy 18 man
          andy 18 man
          1691
          空值
    
    • Shell脚本语言 -> 字符串

    1> 字符串 -> 单引号

    脚本代码:
          name='Andy'
          echo ${name}
    终端执行输出:
          Andy
    

    2> 字符串 -> 双引号

    脚本代码:
          name="Andy"
          echo ${name}
    终端执行结果:
          Andy
    

    3> 字符串 -> 拼接

    方式一
    脚本代码:
          name="jack"
          age=18
          sex="man"
          info="${name} ${age} ${sex}"
          echo $info
    终端执行结果:
          jack 18 man
    
    方式二
    脚本代码:
          name="Andy"
          age=100
          sex="男"
          info=" 姓名:"${name}"   年龄:"${age}"  性别:"${sex}""
          echo ${info}
    终端执行输出:
          姓名:Andy 年龄:100 性别:男
    

    4> 字符串 -> 获取字符串长度

    脚本代码:
          name="HeHe"
          echo ${#name}
    终端执行输出:
          4
    

    5> 字符串 -> 截取

    语法:${变量名:开始位置:截取长度}
    
    案例需求一: 从字符串第三个开始截取,截取三个
    脚本代码:
          name="I have a dream!"
          result=${name:2:3}
          echo $result
    终端执行输出:
          hav
    
    案例需求二: 从字符串第五个开始截取,到最后一个结束.
    方式一
    脚本代码: 
          name="I have a dream!"
          result=${name:4}
          echo $result
    终端执行输出:
          a dream!
    方式二
          name="I have a dream!"
          length=${#name}
          result=${name:4:length-4}
    终端执行输出:
          ve a dream!
    

    6> 字符串->删除

    语法一:${变量名#删除字符串 正则表达式}
    作用:从左边开始匹配要删除的字符串

    案例需求一: 分别从左右侧删除字符串看效果
    脚本代码一:
          name="I have a Dream"
          result=${name#Dream}
          echo ${result}
    终端执行输出:(没有匹配到)
          I have a Dream
    原因: 暂时测试发现,这种只能从字符串左侧第一个字符开始检索删除
    
    脚本代码二:
          name="I have a Dream"
          result=${name#I}
          echo ${result}
    终端执行输出:
          have a Dream
    
    
    案例需求二: 查找指定字符串第一个,并且删除前面多有的字符串(包含自己)
    脚本代码:
          name="I have a Dream"
          result=${name#*a}
          echo ${result}
    终端执行输出:
          ve a Dream
    
    
    案例需求三:执行删除范围(第一个开始删除,删除到哪里)
    脚本代码
          name="I have a Dream"
          result=${name#I*D}
          echo ${result}
    终端执行输出:
           ream
    

    语法二: ${变量名##删除字符串 正则表达式}
    作用:从字符串结尾(右边)开始匹配要删除字符串

    脚本代码:
          name="I have a Dream"
          result=${name##*a}
          echo ${result}
    终端执行输出:
          m
    

    总结: 语法一和语法二都是从左侧第一个字符开始删除到右边,只是检查方向不一样

    语法三:${变量名%删除字符串 正则表达式}
    作用:从字符串结尾开始匹配,删除匹配的字符串.

    案例需求一:查找第一个字符(匹配第一个)
    脚本代码一:
          name="I have a Dream"
          result=${name%a}
          echo ${result}
    终端执行输出:(没有匹配到)
          I have a Dream
    原因: 暂时测试发现,这种只能从字符串右侧第一个字符开始检索删除
    
    脚本代码二:
          name="I have a Dream"
          result=${name%m}
          echo ${result}
    终端执行输出:
          I have a Drea
    
    
    案例需求二:查找指定字符串第一个,并且删除前面所有字符(包含自己)
    脚本代码:
          name="I have a Dream"
          result=${name%h*}
          echo ${result}
    终端执行输出:
          I
    
    
    案例需求三: 指定删除范围
    脚本代码:
          name="I have a Dream"
          result=${name%r*m}
          echo ${result}
    终端执行输出:
          I have a D
    

    语法四: ${变量名%%删除字符串 正则表达式}

    案例需求: 查找指定字符最后一个,并且删除前面所有的字符(包含自己)
    脚本代码:
          name="I have a Dream"
          result=${name%%a*}
          echo ${result}
    终端执行结果:
          I h
    

    总结: 语法三和语法四都是从右侧第一个字符开始删除到左边,只是检查方向不一样

    总结:

    • 左侧第一个字符向右边删除
      • # -> 表示查询方向从左向右
      • ## -> 表示查询方向从右向左
    • 右边第一个字符向左边删除
      • %-> 表示查询方向从右向左
      • %%-> 表示查询方向从左向右

    思考题: 如何删除字符串中间部分?

    如果上述有错误的地方,敬请告知,谢谢!

    相关文章

      网友评论

        本文标题:Shell脚本语言学习一

        本文链接:https://www.haomeiwen.com/subject/chqrvxtx.html