Linux_day02

内容大纲

#1、vim编辑器
    文本编辑  命令驱动
#2、用户权限管理
    用户、用户组及其管理
    文件权限  rwx
    su、sudo
#3、系统信息
    时间、日期
    进程
    磁盘使用情况、内存使用情况
#4、文本处理命令  --了解
    cut wc awk
​
#5、shell编程
    操作访问操作系统内核

VIM、VI编辑器

  • VI编辑器是linux平台上最强悍的==文本编辑器==。主要是以==命令==来驱动执行。

    最困难的就是命令的使用
    区分3种工作模式
  • VIM是VI的增强版本,功能产不多。

  • 3种工作模式

    • ==命令模式==

      直接使用vi打开文件进入的就是命令模式
      在此模式下,所敲的按键都理解为命令 以命令驱动执行不同的功能
      此模型下,不能自由进行文本编辑
    • ==输入模式==(左下角insert标记)

      编辑文本内容
      需要从命令模式按下i进入输入模式
      按下esc回到命令模式
    • ==底线命令模式==

      : 字母
      通常用于文件的保存退出
      ​
      :q 退出
      :w 保存
      :wq 保存退出
      :wq! 强制保存退出
      • 还可以在命令模式下输入:==shift+zz== 快速的保存退出。

  • 打开、新建

    vim  文件名
    ​
    #1、如果编辑的文件不存在 此时就是新建文件 new file
    #2、如果文件存在,就打开文件 进入命令模式
  • 异常模式处理

    • 情况:编辑过程中 ,VIM闪退。导致底层会生成一个swap交换文件,里面记录着未保存的数据

    • 现象:再次打开文件的时候,编辑器会询问你如何处理swap交换文件。

  • vim基本操作命令

    • 光标的移动

      cp /etc/profile ./
      ​
      #1、方向键控制移动  
      #2、命令 hjkl移动
      #3、翻页 pageup  pagedown
      #4、行首(home 0)  行尾(end $)
      ​
      #5、跳到文件的最后一行  G
      #6、跳到文件的第一行  gg
    • 复制粘贴

      #复制
      yy  复制当前行 
      nyy 复制当前行往下n行
      ​
      #粘贴
      p 当前行的下一行粘贴
      P 当前行的上一行粘贴
    • 搜索替换

      #搜索
      /待搜索的内容   回车进行搜索 搜索到的结果高亮显示
      使用n跳转到下一个搜索到的内容  N跳转上一个
      ​
      #清楚搜索匹配之后的高亮显示
      :noh
      ​
      #替换
      :2,4s/原内容/替换内容/gc
      没有g的时候 替换每一行匹配的到的第一个  g表示替换这一行的所有匹配到的
      c表示替换前给用户提示
      ​
      #如果需要进行全局替换 所谓第一行到最后一行
      :1,$s/原内容/替换内容/gc
      :%s/原内容/替换内容/gc
      ​
      hello tom hello allen hello
      allen tom mac apple
      hello allen apple
      hello apple spark allen hadoop spark
      allen allen
    • 删除、撤销

      #删除命令
      dd  删除当前行
      ndd 删除当前行往下n行
      ​
      #撤销、反撤销
      u 撤销上一步的操作  后悔药
      ctrl+r 反撤销
    • 如何进行插入模式、编辑模式?

      在命令模式下面输入字母进入插入模式
      ​
      # i 进入到编辑模式后,定位到当前光标前面
      # o 进入到编辑模式后,在当前行的后面,添加一行空行
      • 常见的组合命令 ==G+o==

        打开文件之后 调整到最后一行 在下一行开始编辑
    • 注意:在crt中,复制的内容单击鼠标右键可以进行粘贴,但是在==vim编辑器中,必须在输入模式下再进行粘贴,否则内容会有丢失的风险==。

    • vim可视模式( VISUAL )

      • 功能:用于文本的选择

        # v       基于字符选择的
        # V       基于行选择的
        # ctrl+v  基于文本块的选择
      • 选择之后配合其他命令进行操作

  • 扩展:notepad++ 文本编辑插件

    • 功能:在windows平台联机编辑linux上的文件,保存之后,自动同步服务器上。

    • 前提:notepad++ 升级到最新版本

    • 安装插件:插件--->插件管理--->NppFTP

    • 插件的配置


用户与权限

  • 用户、用户组

    #用户 user
    linux上可以创建不同的用户  不同用户具有不同的权限
    权限最高的用户叫做root 超级管理员用户
    可以通过root去管理其他用户及权限
    ​
    #用户组 usergroup
    多个用户组成一组 同一组的用户具有相同的权限
  • 权限

    • 读read r

    • 写write w

    • 执行execute x

  • 权限的分配和管理

    • 在linux上对应文件文件夹,划分3个归属

      文件的拥有者 user
      拥有者所在的用户组 group
      其他用户组  others
    • 如何去查看权限 ls -l

      [root@node1 linux02]# ll
      total 8
      -rw-r--r--. 1 root root   47 May 18 11:23 1.txt
      ​
      -rw-r--r-- 就是权限位
          第一位 -文件 d文件夹 l链接
          后面每3位一组
          rw- u 读写
          r-- g 读
          r-- o 读
  • 用户组、用户的管理

    • ==必须是root用户才可以进行管理==。

      #groupadd 组名 新增用户组
      ​
      #cat /etc/group 查看当前系统已有组信息
      itheima:x:1001:lisi,wangwu
      ​
      itheima组名
      x 密码段 没有密码
      1001 groupID  gid 组编号
      lisi,wangwu 归属该组的用户
      ​
      #删除组  groupdel 组名
      ​
      #修改文件归属的组
      chgrp 组名 文件/目录名  针对文件夹加上-R可以实现递归修改
      https://www.runoob.com/linux/linux-comm-useradd.html
      #创建用户
      useradd -m -g 组 新建用户名
          -m 创建用户的家目录
          -g 组 指定用户属于哪个组  如果没有-g 自动创建一个和用户名相同的组名
      #设置密码   
      [root@node1 linux02]# passwd allen
      Changing password for user allen.
      New password: 
      BAD PASSWORD: The password is shorter than 8 characters
      Retype new password: 
      passwd: all authentication tokens updated successfully. 
      ​
      #删除用户
      userdel -r 用户名
      ​
      #查看用户信息
      cat /etc/passwd | grep 用户名
  • SU、SUDO

    • su命令:用于用户之间的切换。

      # su 用户
      ​
      [allen@node1 ~]$ ll /root
      ls: cannot open directory /root: Permission denied
      [allen@node1 ~]$ su root   #普通用户切换成为root需要输入root密码
      Password: 
      ​
      [root@node1 linux02]# su allen   #root用户切换成为普通用户 不需要密码
      [allen@node1 linux02]$ 
      ​
      [allen@node1 linux02]$ exit  #退出
      exit
      ​
      ​
      #弊端:虽然通过切换可以具有root权限,但是root密码已经泄露了 不安全。
      #能不能实现一种 让普通用户临时具有root权限,但是又不泄露密码
    • sudo

      • 功能:给普通用户临时授予root权限。

      • 注意:能够分配sudo的只有root。

      • sudo的配置命令 ==visudo==

      • sudo具体使用

        • step1:使用root用户编辑sudo配置文件

          [root@node1 ~]# visudo
          ​
          ## Allow root to run any commands anywhere
          root    ALL=(ALL)       ALL
          allen   ALL=(ALL)       ALL
          ​
          allen   ALL=(ALL)       /usr/bin/ls  #配置只允许执行指定的命令
        • step2:普通用户执行命令之前需要添加sudo关键字 申请sudo权限校验

          [allen@node1 ~]$ ls /root
          ls: cannot open directory /root: Permission denied
          [allen@node1 ~]$ sudo ls /root
          ​
          We trust you have received the usual lecture from the local System
          Administrator. It usually boils down to these three things:
          ​
              #1) Respect the privacy of others.
              #2) Think before you type.
              #3) With great power comes great responsibility.
          ​
          [sudo] password for allen:    #这里需要输入allen普通用户的密码
          linux02
          [allen@node1 ~]$ sudo ls /root  #密码和sudo校验成功 获取一个为期5分钟的免密操作
          linux02
  • 修改文件的权限

    • 核心的命令 chmod 权限 文件|文件夹 (针对文件夹-R 递归修改)

    • 方式1:老百姓喜闻乐见的形式 ==数字==

      read----->r      4
      write---->w      2
      execute-->x      1
      没有权限           0
      ​
      chmod 777 -R 文件|文件夹
    • 方式2: ==字母 +-形式==

      user->u  group->g others->o  all->a
      + 增加权限
      - 减少权限
      ​
      chmod o-x 1.txt
      chmod a-w 1.txt
    • 方式3: ==等号赋值形式==

      chmod u=rwx 1.txt

Linux系统命令

  • 时间、日期

    [root@node1 linux02]# date
    Tue May 18 14:44:13 CST 2021
    [root@node1 linux02]# date +"%Y-%m-%d %H:%M:%S"
    2021-05-18 14:44:53
    [root@node1 linux02]# cal
          May 2021      
    Su Mo Tu We Th Fr Sa
                       1
     2  3  4  5  6  7  8
     9 10 11 12 13 14 15
    16 17 18 19 20 21 22
    23 24 25 26 27 28 29
    30 31
    ​
    #关于时间日期的同步 后天学习 同步网络授时
    #大数据都是集群环境  基本要求:集群的时间同步问题
  • 查看磁盘、内存信息

    df -h    #disk free 显示磁盘剩余空间
    [root@node1 linux02]# df -h
    Filesystem               Size  Used Avail Use% Mounted on
    devtmpfs                 1.9G     0  1.9G   0% /dev
    tmpfs                    1.9G     0  1.9G   0% /dev/shm
    tmpfs                    1.9G   12M  1.9G   1% /run
    tmpfs                    1.9G     0  1.9G   0% /sys/fs/cgroup
    /dev/mapper/centos-root   38G  1.5G   36G   5% /  #重点关注这一行
    /dev/sda1               1014M  152M  863M  15% /boot
    /dev/mapper/centos-home   19G   33M   19G   1% /home
    tmpfs                    378M     0  378M   0% /run/user/0
    tmpfs                    378M     0  378M   0% /run/user/1000
    ​
    #内存使用情况
    [root@node1 linux02]# free -h
                  total        used        free      shared  buff/cache   available
    Mem:           3.7G        257M        3.0G         11M        467M        3.2G
    Swap:          3.9G          0B        3.9G
  • 进程信息

    #在安装了jdk的情况下 有一个命令专门用于查看本机运行的java进程。
    jps
    ​
    #查看本机运行的所有进程
    ps -ef | grep 进程名
    ​
    #通常根据查询的进程号 结合kill -9 进程号  杀死进程

Linux文本处理命令

  • cut命令:根据条件从命令==结果中提取对应内容==

    #案例:截取出 1.txt 文件中前2行的第5个字符
    [root@node1 linux02]# cat 1.txt 
    111:aaa:bbb:ccc
    222:ddd:eee:fff
    333:ggg:hhh
    444:iii
    [root@node1 linux02]# head -2 1.txt 
    111:aaa:bbb:ccc
    222:ddd:eee:fff
    [root@node1 linux02]# head -2 1.txt | cut -c 4   #注意 从1开始计数的
    :
    :
    [root@node1 linux02]# head -2 1.txt | cut -c 5
    a
    d
    ​
    #案例:截取出 1.txt 文件中前2行以”:”进行分割的第1,2 段内容
    [root@node1 linux02]# head -2 1.txt | cut -d ':' -f1,2
    111:aaa
    222:ddd
    [root@node1 linux02]# head -2 1.txt | cut -d ':' -f1-4   #范围1,2,3,4
    111:aaa:bbb:ccc
    222:ddd:eee:fff
    [root@node1 linux02]# head -2 1.txt | cut -d ':' -f1-   #1到最后
    111:aaa:bbb:ccc
    222:ddd:eee:fff
  • wc命令:显示指定文件字节数, 单词数, 行数 信息。

    [root@node1 linux02]# ll
    total 4
    -rw-r--r--. 1 root root 52 May 18 15:02 1.txt
    [root@node1 linux02]# cat 1.txt 
    111:aaa:bbb:ccc
    222:ddd:eee:fff
    333:ggg:hhh
    444:iii
    [root@node1 linux02]# wc 1.txt 
     4  4 52 1.txt
     
     4表示行
     4表示单词 以空格划分不同单词
     52表示字节数
  • awk命令

    • awk是一门编程语言。

    • 语法功能及其强大,这里介绍awk实现模糊查询、按需提取字段, 还可以进行判断和简单的运算等。

      AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。
      ​
      之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。
    • 命令格式

      awk  [option] '{[pattern] action}'  filenames   #注意[]表示语法可选
      ​
      option  表示可选参数
      '{[pattern] action}'  表示根据什么规则匹配 执行什么动作  默认的动作叫做打印print
      ​
      [root@node1 linux02]# awk '{print}' score.txt 
      zhangsan 68 99 26
      lisi 98 66 96
      wangwu 38 33 86
      zhaoliu 78 44 36
      maq 88 22 66
      zhouba 98 44 46
      ​
      #Q:怎么读取文件的? 整体读?还是一行一行读?  
      底层一行一行的读取数据
      #Q:怎么输出的?
      读取完一行内容之后 默认根据空格切割 一个字段一个字段返回
    • 栗子

      #提取指定字段的内容  如果字段之间以空格分隔  输出的内容就进行拼接
      [root@node1 linux02]# awk '{print $1 $3}' score.txt  
      zhangsan99
      lisi66
      wangwu33
      zhaoliu44
      maq22
      zhouba44
      [root@node1 linux02]# awk '{print $1,$3}' score.txt   #如果字段之间以,分隔  输出的内容                                                      #就以空格进行拼接
      zhangsan 99
      lisi 66
      wangwu 33
      zhaoliu 44
      maq 22
      zhouba 44
      ​
      #指定读取数据切割分隔符
      [root@node1 linux02]# awk -F ':' '{print $2,$4}' 2.txt  
      allen 18
      james 35
      ​
      #指定输出的格式
      allen--->18
      james--->35
      OFS="字符"  output field separator  向外输出时的段分割字符串
      [root@node1 linux02]# awk -F ':' ' {OFS="--->"}{print $2,$4}' 2.txt 
      allen--->18
      james--->35
      ​
      #awk内置的函数
      [root@node1 linux02]# awk -F ' ' '{print toupper($1)}' score.txt
      ZHANGSAN
      LISI
      WANGWU
      ZHAOLIU
      MAQ
      ZHOUBA
      ​
      #if语句判断
      [root@node1 linux02]# awk -F ' ' '{if($4>=60) print $1 $4 "及格"; else print $1 $4 "不及格" }' score.txt
      zhangsan26不及格
      lisi96及格
      wangwu86及格
      zhaoliu36不及格
      maq66及格
      zhouba46不及格

Shell编程

  • shell

    • 指的是一种==程序==,往往是使用C语言开发,功能是访问操作系统内核获取操作系统信息。

    • 指的是==shell脚本语言==,使用什么样的命令语法格式去控制shell程序访问内核。

    • 通常情况下,所说shell编程指的shell脚本编程,==学习shell语法规则==。

  • shell编程开发

    • 在哪里编写?

      只要能进行文本编辑的地方都可以写  linux上常使用vim编辑器开发
      
      
      
    • 需要编译?

      不需要编译
      
      
      
    • 如何执行?

      需要语法解释器 不需要安装 
      Linux系统中集成了很多个同种类的shell解释器
      ​
      [root@node1 linux02]# cat /etc/shells 
      /bin/sh
      /bin/bash
      /usr/bin/sh
      /usr/bin/bash
      /bin/tcsh
      /bin/csh
    • 默认shell解释器 ==bash shell = shell==

      因为很多linux发行版都以bash作为默认的解释器 所以说市面上大多数shell编程都是基于bash开展的
      
      bash shell免费的。
      
      
      
  • shell的快速入门

    • shell脚本文件 后缀名没有要求 ==通常以.sh结尾 见名知意==

    • 格式

      #!/bin/bash   
      echo 'hello shell'
      ​
      #第一行 指定解释器的路径
    • 给脚本授予执行权限

      chmod a+x hello.sh 
      
      
      
    • 执行shell脚本

      • 绝对路径指定shell脚本

        [root@node1 linux02]# /root/linux02/hello.sh 
        hello shell
      • 相对路径

        [root@node1 linux02]# hello.sh   #默认去系统环境变量中寻找  错误
        -bash: hello.sh: command not found
        [root@node1 linux02]# ./hello.sh  #从当前目录下找
        hello shell
      • 把shell脚本交给其他shell程序执行 比如sh

        [root@node1 linux02]# sh hello.sh 
        hello shell
    • 探讨:后缀名 解释器 执行权限是必须的吗? 不是必须的

      [root@node1 linux02]# vim bye.hs
      echo "bye bye"
      ​
      [root@node1 linux02]# sh bye.hs 
      bye bye
      ​
      #文件不是sh结尾 没有授权 没有指定bash解释器路径 但是却可以执行
      #此时这个文件是作为参数传递给sh来执行的  此时解释器是sh 只要保证文件中语法正确就可以执行
  • shell 命令、shell 脚本

    • 都是属于shell的东西

    • shell命令倾向于交互式使用,适合逻辑简单场景

    • shell脚本适合复杂逻辑 理解结合函数、条件判断、流程控制 写出更加丰富的程序。

    • shell命令和shell脚本之间可以互相换行。

    #编写shell脚本 执行脚本
    [root@node1 linux02]# cat hello.sh 
    #!/bin/bash
    echo 'hello shell'
    [root@node1 linux02]# sh hello.sh       
    hello shell
    ​
    #以shell命令执行
    [root@node1 linux02]# echo 'hello shell'
    hello shell
  • shell变量

    • 语法格式

      变量=值  #注意等号两边不能有空格
      ​
      [root@node1 linux02]# name = allen
      -bash: name: command not found
      [root@node1 linux02]# name=allen 
    • 变量的使用

      [root@node1 linux02]# name=allen  
      [root@node1 linux02]# echo name
      name
      [root@node1 linux02]# echo $name
      allen
      [root@node1 linux02]# echo ${name}
      allen
      [root@node1 linux02]# echo $namewoon
      ​
      [root@node1 linux02]# echo ${name}woon
      allenwoon
      ​
      #建议提取变量的时候 使用{}标识变量的边界范围
      ​
      #unset 删除变量
      #readonly 只读变量  不能修改 相当于java中final修饰的
      ​
      [root@node1 linux02]# name=allen
      [root@node1 linux02]# echo ${name}
      allen
      [root@node1 linux02]# name=james
      [root@node1 linux02]# echo ${name}
      james
      [root@node1 linux02]# readonly name=allen
      [root@node1 linux02]# echo ${name}       
      allen
      [root@node1 linux02]# name=james         
      -bash: name: readonly variable
      [root@node1 linux02]# unset name
      -bash: unset: name: cannot unset: readonly variable
      ​
      #只读变量不能够进行删除 只会随着生命周期结束而结束
      #对应shell命令来说 生命周期就是窗口关闭
      #对应shell脚本来说 生命周期就是shell执行结束
    • shell变量分类

      • ==局部变量==

        [root@node1 linux02]# cat a.sh 
        #!/bin/bash
        aaa=itcast
        echo $aaa
        [root@node1 linux02]# cat b.sh
        #!/bin/bash
        echo $aaa
        [root@node1 linux02]# sh b.sh 
        ​
        [root@node1 linux02]# sh a.sh 
        itcast
        ​
        #定义在某个shell脚本中 只在该脚本中有效
      • ==全局变量==(系统变量)

        不管什么程序 什么窗口 都可以加载解析到的
        比如在linux上配置JAVA_HOME=/export/server/jdk-1.8
        
        环境变量文件/etc/profile
        
        
        
  • shell字符串使用

    • 定义字符串

      • 可以使用单引号 可以使用双引号 可以不使用引号

      • ==推荐使用双引号 实现变量的提取==

      [root@node1 linux02]# name=allen
      [root@node1 linux02]# echo $name
      allen
      [root@node1 linux02]# name1='allen1'
      [root@node1 linux02]# echo $name1   
      allen1
      [root@node1 linux02]# name2="allen2" 
      [root@node1 linux02]# echo $name2
      allen2
      ​
      [root@node1 linux02]# echo my name is ${name}
      my name is allen
      [root@node1 linux02]# echo 'my name is ${name}'
      my name is ${name}
      [root@node1 linux02]# echo "my name is ${name}" 
      my name is allen
    • 字符串的使用

      #获取字符串的长度
      [root@node1 linux02]# name=allen
      [root@node1 linux02]# echo ${name}
      allen
      [root@node1 linux02]# echo ${#name}
      5
      #提取子字符串  下标从0开始
      [root@node1 linux02]# words="i like play basketball"
      [root@node1 linux02]# echo ${words:3}  #从3开始到最后
      ike play basketball
      [root@node1 linux02]# echo ${words:3,3}  #注意不是以,分割  这种语法错误
      ike play basketball
      [root@node1 linux02]# echo ${words:3:3}  #从3开始截取3个
      ike
      ​
      #查找子字符串
  • ==反引号==

    • `

    • 英文状态下输入ESC下面

    • 功能:表示执行反引号的命令

    #需求:把date命令执行的结果赋值给nowtime变量 
    [root@node1 linux02]# date
    Tue May 18 17:01:55 CST 2021
    [root@node1 linux02]# nowtime=date   #如果没有反引号 理解为字符串
    [root@node1 linux02]# echo $nowtime
    date
    [root@node1 linux02]# nowtime=`date`  #使用反引号 理解为执行命令 把命令的结果进行赋值
    [root@node1 linux02]# echo $nowtime 
    Tue May 18 17:02:41 CST 2021
  • shell程序传递

    • 别名:动态传参

    • java中如何动态把参数传递到程序中去?

    public static void main(String args[]){
        args[0] --->
        .....    
    }
    ​
    ​
    //如何执行java程序
    ​
    java -jar xxxx.jar  mainclass arg1 arg2
        
    //arg1 arg2就是动态传入到程序内部的参数  内部由args数组接收    
    • shell动态传参

      #传递参数的方式
      ​
      sh  hello.sh  参数1,参数2,参数3...
      ​
      #shell脚本内部如何接收
      ​
      #!/bin/bash
      echo "第一个参数为: $1";
      echo "第三个参数为: $3";
      echo "脚本的名称是: $0";
      echo "参数个数为: $#";
      echo "传递的参数作为一个字符串显示: $*";
      ​
      [root@node1 linux02]# sh c.sh 
      第一个参数为: 
      第三个参数为: 
      脚本的名称是: c.sh
      参数个数为: 0
      传递的参数作为一个字符串显示: 
      [root@node1 linux02]# sh c.sh  11 22 33 44 55
      第一个参数为: 11
      第三个参数为: 33
      脚本的名称是: c.sh
      参数个数为: 5
      传递的参数作为一个字符串显示: 11 22 33 44 55
    • 动态传参中 和​@区别

      #被" "包含时
      "$*" 会将所有的参数作为一个整体,以"$1 $2 … $n" 的形式组成一个整串;
      "$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式组成一个参数列表。
      ​
      [root@node1 linux02]# vim d.sh
      #!/bin/bash
      echo "$*"
      echo "---------------"
      echo "$@"
      ​
      [root@node1 linux02]# sh d.sh 11 22 33
      11 22 33
      ---------------
      11 22 33
      ​
      #思考 如何确定是一个整体 各个独立的?  长度?循环次数?
  • shell运算符

    • Shell 和其他编程语音一样,支持包括:算术、关系、布尔、字符串等运算符。

    • ==原生/bin/bash 不支持简单的数学运算==。可以借助其他工具命令来实现。

    • 算术运算

      [root@node1 linux02]# a=1+1
      [root@node1 linux02]# echo $a
      1+1
      ​
      #方式1:expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
      `expr 2 + 3`   使用expr的时候 运算符两边要有空格
      ​
      [root@node1 linux02]# a=`expr 1+1`
      [root@node1 linux02]# echo $a
      1+1
      [root@node1 linux02]# a=`expr 1 + 1`
      [root@node1 linux02]# echo $a       
      2
      ​
      #方式2:$[1+2]
      [root@node1 linux02]# a=$[2+3]
      [root@node1 linux02]# echo $a 
      5
      ​
      #方式3:只能实现+1 -1操作
      ((a++)) ((a--))
      [root@node1 linux02]# a=1
      [root@node1 linux02]# echo $a
      1
      [root@node1 linux02]# ((a++))
      [root@node1 linux02]# echo $a
      2
      ​
      #栗子
      #!/bin/bash
      ​
      a=10
      b=20
       
      val=`expr $a + $b`
      echo "a + b : $val"
      ​
      val=`expr $a - $b`
      echo "a - b : $val"
      ​
      val=`expr $a \* $b`
      echo "a * b : $val"
      ​
      val=`expr $b / $a`
      echo "b / a : $val"
      ​
      val=`expr $b % $a`
      echo "b % a : $val"
    • 关系运算符

      #关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
      ​
      EQ 就是 EQUAL等于
      NQ 就是 NOT EQUAL不等于
      GT 就是 GREATER THAN大于  
      LT 就是 LESS THAN小于 
      GE 就是 GREATER THAN OR EQUAL 大于等于 
      LE 就是 LESS THAN OR EQUAL 小于等
      ​
      #!/bin/bash
      ​
      a=10
      b=20
      ​
      if [ $a -eq $b ]
      then
         echo "$a -eq $b : a 等于 b"
      else
         echo "$a -eq $b: a 不等于 b"
      fi
      if [ $a -ne $b ]
      then
         echo "$a -ne $b: a 不等于 b"
      else
         echo "$a -ne $b : a 等于 b"
      fi
      if [ $a -gt $b ]
      then
         echo "$a -gt $b: a 大于 b"
      else
         echo "$a -gt $b: a 不大于 b"
      fi
      if [ $a -lt $b ]
      then
         echo "$a -lt $b: a 小于 b"
      else
         echo "$a -lt $b: a 不小于 b"
      fi
      if [ $a -ge $b ]
      then
         echo "$a -ge $b: a 大于或等于 b"
      else
         echo "$a -ge $b: a 小于 b"
      fi
      if [ $a -le $b ]
      then
         echo "$a -le $b: a 小于或等于 b"
      else
         echo "$a -le $b: a 大于 b"
      fi
    • 布尔运算符

      != 不等于
      -a and 
      -o or
      
      
      
  • 流程控制

    • if..else ==在语句结束的时候反写if fi==

      • 单if

        if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi
        ​
        #功能:判断ssh服务是否启动
        ​
        #将上述的shell命令改写为shell脚本
        [root@node1 linux02]# vim if.sh
          
        #!/bin/bash
        if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then
         echo "ssh启动了"
        fi
      • if..else

      • 嵌套if

        a=10
        b=20
        if [ $a == $b ]
        then
           echo "a 等于 b"
        elif [ $a -gt $b ]
        then
           echo "a 大于 b"
        elif [ $a -lt $b ]
        then
           echo "a 小于 b"
        else
           echo "没有符合的条件"
        fi
    • for循环

      • 方式1:

        for N in 1 2 3; do echo $N; done
        或
        for N in {1..3}; do echo $N; done
      • 方式2 :

        for ((初始值; 限制值; 执行步长))
        do
           程序段
        done
    • while循环

      while [ expression ]
      do
          command
          …
      done
      • 应用:模拟数据源实时不间断产生

        while true;do date >>/root/itcast.txt;sleep 0.5;done
    • case匹配

      echo '输入 1 到 4 之间的数字:'
      echo '你输入的数字为:'
      read aNum
      case $aNum in
          1)  echo '你选择了 1'
          ;;
          2)  echo '你选择了 2'
          ;;
          3)  echo '你选择了 3'
          ;;
          4)  echo '你选择了 4'
          ;;
          *)  echo '你没有输入 1 到 4 之间的数字'
          ;;
      esac
  • shell函数的使用

    • 背景:shell不需要进行编译,解释器从上往下从左往右读取代码执行。

    • 结论:在shell中先定义函数 再使用函数,==函数定义要放在使用之前==。

    • 语法格式

      [ function ] funname ()
      {
          程序段;
          [return int;]
      }
    • 函数入门案例

      [root@node1 ~]# vim f.sh
        
      #!/bin/bash
      #1、定义函数
      sayhello ()
      {
       echo "hello a"
      }
      ​
      echo "--------"
      ​
      #调用函数
      sayhello
                                                                                               
      "f.sh" [New] 11L, 103C written                                             
      [root@node1 ~]# sh f.sh 
      --------
      hello a
    • 调用函数的时候 动态传参 传递给函数内部

      [root@node1 ~]# vim f1.sh
        
      #!/bin/bash
      #1、定义函数
      sayhello ()
      {
       echo $1  #在函数体内部使用符号接收传递参数
       echo $2
      }
      ​
      #调用函数并传递2个参数
      sayhello 111 22
    • 函数的返回值的使用

      #!/bin/bash
      ###演示带返回值的参数
      function getMax()
      {
      if [ $1 -lt $2 ]; then
      return $2
      else
      return $1;
      fi
      }
      echo "Shell 程序中传递的两个参数是:$1 , $2"
      ##调用函数
      getMax $1 $2
      echo "最大值::$?" ##$?表示返回值
      ​
      ​
      #首先执行shell脚本的时候 把外界的参数传递给shell脚本内部 作为内部变量
      #在shell脚本内部调用函数 把内部变量作为参数传递给函数  函数内部接收到参数使用
  • 数组使用

    #数组定义 Shell数组用括号来表示,元素用"空格"符号分割开,语法格式如下:
    array_name=(value1 value2 value3 ... valuen)
    [root@node1 ~]# a1=(hadoop hive spark)
    ​
    #数组的取值  通过下标  从0开始
    ${array_name[index]}
    ​
    [root@node1 ~]# echo ${a1[1]}
    hive
    [root@node1 ~]# echo ${a1[2]}
    spark
    ​
    #遍历数组  for
    ​
    for var in ${my_arr[*]}
      do
      echo $var
    done 
  • source加载其他脚本

    • 相当于java中import

    • 在使用shell编写程序的 可以将通用的逻辑或者代码集中定义编写

    • 在其他脚本中如果需要使用 source加载 解耦合


今日作业

1、复习今天课程知识
  重点:vim编辑器使用   用户权限概念的理解  系统信息的查看  shell编程(编写简单脚本 看懂shell脚本)
  
2、练习linux-day02讲义的案例 尤其是shell脚本案例
	测试$* $@区别
	shell脚本实现对输入数字奇偶判断 (read命令)

3、预习linux-day03


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(Linux)