Shell

  •  Shell 介绍

  •    shell是一个用c语言编写的程序,他被称为用户使用linux的桥梁

          shell即是一种命令语言,又是一种程序语言

          shell脚本是一种为shell编写的脚本程序

  •  Shell运行环境和运行方式

  •  shell编程和java,python等一样,只需要一个文本编辑器和解释工具即可

        linux的shell太多,常见的有:

        Bourne Shell (/usr/bin/sh或/bin/sh)  在linux下:/bin/sh

        Bourne Again Shell (/bin/bash)  在linux下:/bin/bash

        C Shell (/usr/bin/csh)  在linux下: /bin/tcsh

        K Shell  (/usr/bin/ksh)  是c  shell 的超集

        Shell  for Root  (/sbin/sh)

        其中linux自带有:/bin/bash 、/bin/sh、/bin/tcsh、/bin/csh 等以上的集中都是交互式的

       

        bash易用和免费。Bash在日常工作中被广泛使用

        bash也是大多数Linux系统默认的Shell

        #!/bin/sh等价于#!/bin/bash

  •  一个hello world 实例:

        编辑第一个shell脚本

        vim /home/shell/firstshell

        #!/bin/bash

        echo 'hello world'

        保存退出即可

        #!/bin/bash 是一种约定的标记,他告诉系统该脚本用什么解释器执行,即是那一类脚本

       怎么注释:   除了(#!/bin/bash)这个#号不是注释外,其余几乎都是注释

  •  运行方式

       a、可执行权限运行:

        chmod a+x /home/shell/first.sh     //使脚本具有执行权限

        /home/shell/first.sh      //执行脚本

      b、加解释器运行:

       /bin/bash /home/shell/first.sh

       不用赋予脚本执行权限;

       不用在脚本第一行加 #!/bin/bash  ,加了也是外面的生效

  •  Shell的变量

  •  变量定义

         定义变量时,变量名不加 $ 符 如:name="1511A"

         注意:变量名和等号之间不能有空格,同时,变量名的命名须遵循如下规则:

         首个字符必须为字母{a-z,A-Z}

         中间不能有空格 ,可以使用下划线 (_)

         不能使用标点符号

         不能使用bash里的关键字 (可用help命令查看保留关键字)

  •  变量的赋值

         显式的直接赋值(可以重复为变量赋值):

             name="你好"

         用语句给变量赋值,如:

             name='expr 2 + 2'

             以上语句将2+2的值给变量

             注意:其中的空格,必须要有

  •  使用变量(linux中的使用变量必须加$)

         使用一个定义过的变量,只要在变量名前面加$符号即可,如:

         echo $name

         echo ${name}

         变量名外面的花括号是可选的,加不加都行

         加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:

         name="17.1A"

         echo "qianfeng${name}班"

  • 只读变量

       使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变

       下面的例子尝试更改只读变量,结果报错:

         Shell_第1张图片\

  • 删除变量

        一种方式是直接将整行赋值命令删除掉

        第二种是在赋值语句下面加上

        unset +变量名

  • 变量类型:(局部变量(常用)、环境变量、shell变量)

       运行shell时,会同时存在三种变量:

       1)局部变量  局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量

       2)环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行,必要的时候shell脚本也可以定义环境变量

       3)shell变量  shell变量是由shell程序设置的特殊变量

             shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

  • shell字符串

        字符串是shell编程中最常用最有用的数据类型,字符串可以用单引号,也可以用双引号,也可以不用引号

         单引号

              str='this is a string'

              注意:单引号里的任何字符都回原样输出,单引号字符串中的变量是无效的;

                         单引号字符串中不能出现单引号(对单引号使用转义符后也不行)

         双引号

               class=1701A

               str="this is \"$class\"!\n"

                双引号的优点: 双引号里可以有变量,双引号里可以出现转义字符

         反引号

                shell中加上反引号会被认为是一个命令

                shell中写入

                    class=`date`

                    echo  "class is ${class}"

                执行shell文件会输出 class is +当前当前时间   

         拼接字符串

                your_name="haha"

                greeting="hello,$your_name!"

                echo greeting

         获取字符串长度

                string="abcdef"

                echo ${#string}   //输出 6

          获取子字符串

                string=''this is class''

                echo ${string:1:3}        //表示从字符串的第二个字符开始一共取三个  输出为his

         查找子字符串

                查找字符 " i 或 s" 的位置

                string="this is a class"

                echo `expr index "$string"  is`    //输出3  (注意""不能去掉)

                注意:以上脚本中 " ` " 是反引号,而不是单引号

  •  Shell数组

  •    bash支持一维数组(不支持多维数组),并且没有限定数组的大小,数组元素的下标由0开始

           获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0

  • 定义数组

        在shell中,用括号来表示数组,数组元素用 "空格" 符号分开,定义数组的一般形式为:

        数组名=(值1  值2  ..... 值n)

        例如:  array_name=(value0 value1 value2 value3 value4)

        在shell文件中定义 arr1=(1 2 3 4 'hello' 'world')

                                       echo $(arr1[*])      //打印数组所有的值   或者 * 换为@符

                                       echo $(arr1[1])     //打印数组的第二个值

                                       echo $(#arr1[*])    //打印数组的长度

                                       修改shell文件权限为744  执行后会输出 

  •  Shell注释

          以 "#"开头的行就是注释,会被解释器忽略。(除第一行的解释器以外)

          sh里没有多行注释,只能每一行加一个#号

          注:如果在开发中遇到大量代码需要临时注释起来,过一会又取消注释,可以把这一段代码用一对花括号括起来,定义成一个函数,没有地方调用这个函数,这块代码就不会执行,达到和注释一样的效果   

  • Shell基本运算符

       shell中运算符包括:数学运算符,关系运算符,布尔运算符,字符串运算符,文件运算符

       原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如  awk 和 expr, expr最常用

       expr是一款表达式计算工具,使用他能完成表达式的求值操作。

       例如两个数相加(注意使用的是反引号 ` 而不是单引号 ' ):

  •   数学运算符

        #!/bin/bash   

        a=20

        b=10

        echo `expr $a + $b`

        echo `expr $a - $b`

        echo `expr $a \* $b`       //乘号需要转义符

        echo `expr $a / $b`

        echo `expr $a % $b`       

  • 关系运算符

        关系运算符只支持数字,不支持字符串,除非字符串的值是数字

        假定变量 a 为 10, 变量 b 为 20

        Shell_第2张图片

  • 布尔运算符 

   Shell_第3张图片

  • 字符串运算符

    Shell_第4张图片

  • 文件测试运算符

     Shell_第5张图片

     Shell_第6张图片

     实例

    Shell_第7张图片

  • Shell条件控制

  • if 条件分支判断

       Shell_第8张图片

     Shell_第9张图片

  •   for循环判断

     Shell_第10张图片

     例如

  

   会打印出  1 2 3 4 5 

    shell文件中写入如下语句    seq 表示从1到20循环递增   执行文件后会循环输出1到20

   Shell_第11张图片

    shell中编写循环创建文件

     Shell_第12张图片

  •  while

     Shell_第13张图片

    循环打印1 到20   i=`expr  $i  +  1`  可以换成   let  "i++"

  •  case in

       case:匹配:(必须有in,一个模式结束必须用双 ;; 号,esac整个case(case的反转)结束标识)

       Shell_第14张图片

  • 例子

       Shell_第15张图片

  •  Shell中的方法

  •   定义

      Shell_第16张图片

  •  实例

      Shell_第17张图片

     带返回值的

     Shell_第18张图片

      带参数的    (参数位数大于两位数要加上花括号,不加就会输出原值)  

      例如下面的第一个第十个参数会输出10  第二个第十个参数才会输出900

      Shell_第19张图片

       通过命令端传递参数    定义wpar.sh文件

        Shell_第20张图片

        命令端执行      

        特殊字符处理参数

         $#   传递到脚本的参数个数

         $*    以一个单字符串显示所有向脚本传递的参数

         $@ 与 $* 相同,但是使用时加引号,并在引号中返回每个参数

  •  Shell文件引入

         和其它语言一样,shell也可以包含外部脚本,这样可以很方便的封装一些公用代码作为一个独立的文件

          shell文件包含的语法格式如下:

          . filename        //注意点号(.)和文件名中间有一空格

          或

          source  filename 

          实例:

           Shell_第21张图片

  •  Shell中脚本的调试

  •  shell的语法检测

         1.shell语法检测

              sh -n ./test.sh   (sh是/bin/sh  是系统提供的可执行脚本)

               例如:  在test.sh中写入

                Shell_第22张图片

                因为for循环没有写 do

                所以执行  sh -n ./test.sh   会检测出脚本中的错误

         2.shell的普通调试  (当脚本比较大的时候不建议使用)

              sh-x  ./test.sh

        3.shell的中断调试:(在shell中添加一个睡眠,保证可以有时间中断调试   sleep  3   睡眠3秒执行下一语句)

           中断调试  在脚本中写  sleep 3  ,执行脚本文件时  按ctrl+Z会停止脚本执行来观察结果,然后再按fg键继续调试即可(先按 f 再按 g 键)

        4.使用调试工具  -bashdb

           功能:类似于GDB的调试工具,可以完成对shell脚本的断点设置,单步执行,变量观察等许多功能

           场合:脚本比较大时,通过 -x 参数调试时以不方便时

           用法:        bashdb --debug  脚本名    

                 或者     bashdb -c script.sh   

           说明:

            Shell_第23张图片

            bashdb常用命令:

            Shell_第24张图片

 

你可能感兴趣的:(Linux,shell)