一,Shell概述

  1,shell是什么

    shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求,以便运行程序的界面系统级程序,用户可以用shell来启动,挂起,停止甚至是编写一些程序

    shell还是一个功能相当强大的编程语言,易编写,易调试,灵活性较强

    shell是解释执行的脚本语言,在shell中可以直接调用Linux系统命令

  2,shell的分类

    Bourne Shell:从1979年起Unix就开始使用Bourne Shell,Bourne Shell的主文件名为sh

    C Shell:C Shell 主要在BSD版的Unix系统中使用,其语法和C语言相类似而得名

    Shell的两种主要语法类型有Bourne和C,这两种语法彼此不兼容,Bourne家族主要包括sh,ksh,Bash,psh,zsh;C家族主要包括:csh,tcsh

    Bash:Bash和sh兼容,现在使用的Linux就是使用Bash作为用户的基本shell

  3,Linux支持的Shell

    /etc/shells

    centos7只支持sh和bash

 

二,shell脚本的执行方式

  1,echo输出命令

    echo [选项] 【输出内容】

    选项:

      -e :支持反斜线控制的字符转换

      Linux Shell基础_环境变量

 

 

  2,第一个脚本

    #!/bin/bash

  3,脚本执行

    1,赋予执行权限,直接运行

      chmod 755 hello.sh

      ./hello.sh

    2,通过bash调用执行脚本

      bash hello.sh

  

  dos2unix  windows==>Linux

  yun -y install dos2unix 下载dos2unix 

  在DOS下,文本文件的换行符为CRLF,而在Linux下换行符为LF,当将windows下的文件上传到Linux上,执行的时候有时会出现奇怪的问题

  dos2unix hello.sh 

  当然也有将linux上的shell转换成windows上能运行的程序 unix2dos

 

三,Bash的基本功能

  1,历史命令与命令补全

    1,历史命令

      history 【选项】【历史命令保存文件】

      选项:

        -c 清空历史命令

        -w 把缓存中的历史命令写入历史命令保存文件

      历史命令默认会保存1000条,可以在环境变量配置文件 /etc/profile中进行修改

    历史命令调用

    1,使用上下箭头调用以前的历史命令

    2,使用"!n"重复执行第n条历史命令

    3,使用"!!"重复执行上一条命令

    4,使用"!子串"重复执行最后一条以该字串开头的命令

    

    2,命令与文件补全

      在Bash中,命令与文件补全是非常方便与常用的功能,我们只要在输入命令或文件时,按"Tab"键就会自动进行补全,按两下"Tab"可以显示可用命令

 

  2,命令别名与常用快捷键

    1,命令别名

      alias 别名='原命令'

      设定命令别名

      alias

      查询命令别名

      命令执行时顺序:

        1,第一顺位执行用绝对路径或相对路径执行的命令

        2,第三顺位执行别名

        3,第三顺位执行Bash的内部命令

        4,第四顺位执行按照 $PATH 环境变量定义的目录查找顺序找到的第一个命令

      让别名永久生效

        vi /root/.bashrc

    2,Bash常用快捷键

 

  3,输入输出重定向

    1,标准输入输出

      设备  设备文件名    文件描述符  类型

      键盘  /dev/stdin       0      标准输入

      显示器 /dev/stdout     1      标准输出

      显示器 /dev/stderr      2      标准错误输出

    2,输出重定向

      Linux Shell基础_配置文件_02

 

     3,输入重定向

      wc 【选项】【文件名】

      选项:

        -c 统计字节数

        -w 统计单词数

        -l 统计行数

      命令 < 文件 把文件作为命令的输入

  

  4,多命令顺序执行与管道符

    1,多命令顺序执行

      Linux Shell基础_配置文件_03

 

       

      dd命令

      dd if=输入文件 of=输出文件 bs=字节数 count=个数

      选项:

        if=输入文件  指定源文件或源设备

        of=输出文件  指定目标文件或目标设备

        bs=字节数   指定一次输入/输出多少字节,即把这些字节看做一个数据块

        count=个数   指定输入/输出多少个数据块

    命令 && echo yes || echo no

    2,管道符

      命令1 | 命令2

      命令1的正确输出作为命令2的操作对象

      ls -a /etc/ | more 

     grep 【选项】"搜索内容"

     选项:

      -i  忽略大小写

      -n  输出行号

      -v  反向查找

      --color=auto  搜索出的关键字用颜色显示

  

  5,通配符与其他特殊符号

    1,通配符

      ?  匹配一个任意字符

      *  匹配0个或任意多个任意字符,也就是可以匹配任何内容

      []  匹配中括号中任意一个字符

    2,Bash中其他特殊符号

      单引号是强引用,双引号是弱引用

      ' '  单引号  在单引号中所有的特殊符号,如"$" 和 "`"(反引号)都没有特殊含义

      " "  双引号  $,`,\是例外,拥有"调用变量的值","引用命令"和"转义符"的特殊含义

      ` `,$()     用来引用系统命令

 

四,Bash变量

  1,用户自定义变量

    1,什么是变量

      变量是计算机内存的单元,其中存放的值可以改变,当shell脚本需要保存一些信息时,如一个文件名或是一个数字,就把它存放在一个变量中,每个变量有一个名字,所以很容易引用它,使用变量可以保存有用信息,使系统获知用户相关设置,变量也可以用于保存暂时信息

    2,变量设置规则

      1,变量名称可以由字母,数字和下划线组成,但是不能以数字开头

      2,在Bash中变量的默认类型都是字符串型,如果要进行数值运算,则必须指定变量类型为数值型

      3,变量用等号连接值,等号左右两侧不能有空格

      4,变量的值如果有空格,需要使用单引号或双引号包括

      5,在变量的值中,可以使用"\"转义符

      6,如果需要增加变量的值,那么可以进行变量值的叠加。不过变量需要用双引号包含"$变量名"或用${变量名}包含

      7,如果是把命令的结果作为变量值赋予变量,则需要使用反引号或$()包含命令

      8,环境变量名建议大写,便于区分

    3,变量分类

      1,用户自定义变量

      2,环境变量:这种变量中主要保存的是和系统操作环境相关的数据

      3,位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的

      4,预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的

    4,本地变量

      1,变量定义

      2,变量叠加

      3,变量调用

      4,变量查看 set

      5,变量删除 unset name

  2,环境变量

    1,环境变量是什么

      用户自定义变量只在当前的shell中生效,而环境变量会在当前shell和这个shell的所有子shell当中生效,如果把环境变量写入相应的配置文件,那么这个环境变量就会在所有的shell中生效

    2,设置环境变量

      export 变量名=变量值    声明变量

      env            查询变量

      unset 变量名        删除变量

      pstree            确认进程树

    3,系统常见环境变量

      1,PATH:系统查找命令的路径

      2,PATH="$PATH":/root/sh

        PATH变量叠加

        PS1:定义系统提示符的变量

        echo $PS1

  3,位置参数变量

    位置参数变量

    

$1, $2, …:

对应第1、第2等参数,shift [n]换位置

$0: 

命令本身

$*: 

传递给脚本的所有参数,全部参数合为一个字符串;代表“$1$2$3…”

$@: 

传递给脚本的所有参数,每个参数为独立字符串;代表“"$1" "$2" "$3" …”

$#: 

传递给脚本的参数的个数

  4,预定义变量

    1,预定义变量

      $?      最后一次执行的命令返回状态,0为成功,非0为失败
      $$      当前进程的进程号
      $!       后台运行的最后一个进程的进程号

    2,接收键盘输入

      read 【选项】【变量名】

      选项:

        -p "提示信息" :在等待read输入时,输出提示信息

        -t 秒数    read命令会一直等待用户输入,使用此选项可以指定等待时间

        -n 字符数   read 命令只接受指定的字符数,就会执行(秒)

        -s      隐藏输入的数据,适用于机密信息的输入

  

  5,数字运算与运算符

    1,declare 声明变量类型

      declare 【+/-】【选项】变量名

      选项:

        -:给变量设定类型属性

        +:取消变量的类型属性

        -i:将变量声明为整数型(integer)

        -x:将变量声明为环境变量

        -p:显示指定变量的被声明的类型

    2,数值运算

    方法一:

      aa=11

      bb=22

      给变量 aa 和 bb赋值

      declare -i cc=$aa+$bb

    方法二:

      expr或let数值运算工具

      aa=11

      bb=22

      dd=$( expr $aa + $bb)

      dd的值是aa和bb的和,注意"+"号左右两侧必须有空格

    方法三:

      "$((运算式))"或"$[运算式]"

      ff=$(($aa+$bb))

      gg=$[$aa+$bb]

    3,运算符

  6,变量测试与内容替换

    Linux Shell基础_bash_04

 

 

     需要的时候查表就可以了,不用死记

 

五,环境变量配置文件

  1,环境变量配置文件简介

    1,source 命令

      source 配置文件 或 . 配置文件 (让配置文件直接生效)

    2,环境变量配置文件简介

      环境变量配置文件中主要是定义对系统的操作环境生效的系统默认环境变量

      比如PATH,HISTSIZE,PS1,HOSTNAME等默认环境变量

      /etc/profile

      /etc/profile.d/*.sh

      ~/.bash_profile

      ~/.bashrc

      /etc/bashrc

  2,环境变量配置文件作用

    /etc/profile的作用

    USER变量->LOGNAME变量->MAIL变量->PATH变量->HOSTNAME变量->HISTSIZE变量->umask->调用/etc/profile.d/*.sh文件

    ~/.bash_profile的作用

      1,调用了~/.bashrc文件

      2,在PATH变量后面加入了":$HOME/bin"这个目录

    /etc/bashrc的作用

      1,PS1变量

      2,umask

      3,PATH变量

      4,调用/etc/profile.d/*.sh

  3,其他配置文件和登录信息

    1,注销时生效的环境变量

      ~/.bash_logout

    2,其他配置文件

      ~/.bash_history

    3,shell登录信息

      本地终端欢迎信息:/etc/issue

      对照表格:

        

  1. \d //本地端时间的日期;
  2. \l //显示当前tty的名字即第几个tty;
  3. \m //显示硬体的架构 (i386/i486/i586/i686...);
  4. \n //显示主机的网路名称;
  5. \o //显示 domain name;
  6. \r //当前系统的版本 (相当于 uname -r)
  7. \t //显示本地端时间的时间;
  8. \u //当前有几个用户在线。
  9. \s //当前系统的名称;
  10. \v //当前系统的版本。

      远程终端欢迎信息:/etc/issue.net

        1,转义符在 /etc/issue.net 文件中不能使用

        2,是否显示此欢迎信息,由ssh的配置文件 /etc/ssh/sshd_config决定,加入"Banner /etc/issue.net"行才能显示(记得重启SSH服务)

        3,登录后欢迎信息:/etc/motd

          不管是本地登录,还是远程登录,都可以显示此欢迎信息