概述

Shell是一个命令解释器,接收应用程序/用户命令,然后调用操作系统内核

Shell解析器

  1. Linux提供的Shell解析器有:

    1
    2
    3
    4
    5
    6
    7
    [lvxiaoyi@localhost sheellStudy]$ cat /etc/shells
    /bin/sh
    /bin/bash
    /sbin/nologin
    /usr/bin/sh
    /usr/bin/bash
    /usr/sbin/nologin
  2. bash和sh的关系

    1
    2
    3
    4
    5
    [lvxiaoyi@localhost bin]$ ll /bin/ | grep bash
    -rwxr-xr-x. 1 root root 964544 Apr 11 2018 bash
    lrwxrwxrwx. 1 root root 10 Oct 13 07:38 bashbug -> bashbug-64
    -rwxr-xr-x. 1 root root 6964 Apr 11 2018 bashbug-64
    lrwxrwxrwx. 1 root root 4 Oct 13 07:38 sh -> bash

    我们能够看到sh是bash的软连接,最终调用的还是bash

  3. Centos默认的解析器是bash

    1
    2
    3
    [lvxiaoyi@localhost bin]$ echo $SHELL
    /bin/bash

    ​ bash是一个二进制文件,里面存放这各种命令

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [lvxiaoyi@localhost bin]$ hexdump -n 100 bash
    0000000 457f 464c 0102 0001 0000 0000 0000 0000
    0000010 0002 003e 0001 0000 d3e1 0041 0000 0000
    0000020 0040 0000 0000 0000 b080 000e 0000 0000
    0000030 0000 0000 0040 0038 0009 0040 001d 001c
    0000040 0006 0000 0005 0000 0040 0000 0000 0000
    0000050 0040 0040 0000 0000 0040 0040 0000 0000
    0000060 01f8 0000
    0000064

Shell脚本入门

脚本格式

1
#!/bin/bash

单纯的#是注释

#!是系统的标识符,让系统知道后面的是特殊命令

/bin/bash 表示让指定系统使用bash来作为这个文件的解释器

案例

  1. helloWorld

    1
    2
    3
    4
    5
    6
    7
    8
    [lvxiaoyi@localhost sheellStudy]$ vim helloWorld.sh

    #!/bin/bash
    echo "helloWorld"


    [lvxiaoyi@localhost sheellStudy]$ bash helloWorld.sh
    helloWorld
  2. 脚本的常用执行方式

    1. 采用bash或sh+脚本的相对路径或绝对路径(不用赋予脚本+x权限)

      1
      2
      [lvxiaoyi@localhost sheellStudy]$ bash helloWorld.sh 
      helloWorld
    2. 采用输入脚本的绝对路径或相对路径执行脚本(必须具有可执行权限+x)

      1
      2
      3
      4
      5
      [lvxiaoyi@localhost sheellStudy]$ ./helloWorld.sh
      bash: ./helloWorld.sh: Permission denied
      [lvxiaoyi@localhost sheellStudy]$ chmod u+x helloWorld.sh
      [lvxiaoyi@localhost sheellStudy]$ ./helloWorld.sh
      helloWorld

      注意:第一种执行方法,本质是bash解析器帮你执行脚本,所以脚本本身不需要执行权限(#!/bin/bash其实也没有起作用)。第二种执行方法,本质是脚本需要自己执行,所以需要执行权限。

  3. 执行系统命令

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    [lvxiaoyi@localhost sheellStudy]$ vim system.sh

    #!/bin/bash
    pwd
    echo "hello"
    touch cls.txt
    echo "I love you" >> cls.txt


    [lvxiaoyi@localhost sheellStudy]$ bash system.sh
    /home/lvxiaoyi/sheellStudy
    hello
    [lvxiaoyi@localhost sheellStudy]$ ll
    total 16
    -rw-rw-r--. 1 lvxiaoyi lvxiaoyi 11 Oct 13 09:04 cls.txt
    -rw-r--r--. 1 root root 68 Oct 13 07:52 for.sh
    -rw-rwxr-x. 1 lvxiaoyi lvxiaoyi 30 Oct 13 09:00 helloWorld.sh
    -rw-rw-r--. 1 lvxiaoyi lvxiaoyi 72 Oct 13 09:04 system.sh
    [lvxiaoyi@localhost sheellStudy]$ cat cls.txt
    I love you

    Shell中的变量

    系统变量

    1. 常用系统变量

      $HOME、$PWD、$SHELL、$USER等

    2. 案例

      1. 查看系统变量的值

        1
        2
        [lvxiaoyi@localhost sheellStudy]$ echo $HOME
        /home/lvxiaoyi
      2. 显示当前Shell中所有变量:set

        1
        2
        3
        4
        5
        6
        7
        8
        9
        [lvxiaoyi@localhost sheellStudy]$ set 
        BASH=/usr/bin/bash
        BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:histappend:hostcomplete:interactive_comments:progcomp:promptvars:sourcepath
        BASH_ALIASES=()
        ...
        SHELL=/bin/bash
        _=-help
        colors=/home/lvxiaoyi/.dircolors

    自定义变量

    1. 基本语法

      1. 定义变量:变量=值(注意:等号两侧不能有空格)
      2. 撤销变量:unset 变量名
      3. 生命静态变量:readonly变量,注意:不能unset
    2. 自定义变量规则

      1. 变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写。
      2. 等号两侧不能有空格
      3. 在bash中,变量默认类型都是字符串类型,无法直接进行数值运算。
      4. 变量的值如果有空格,需要使用双引号或单引号括起来。
    3. 案例

      1. 自定义变量

        1