云计算运维 · 第三阶段 · shell编程

学习b记 · 第二阶段

一、shell编程

1、什么是shell
    shell是一种命令语言,是为使用者提供操作界面的一种软件,软件可以接收用户的命令,并且执行用户输入的命令,然后对相应的程序进行调用。
2、shell可以分为两种方式
    1)shell命令行式
        例如一些系统linux,从传统的意义上来说,如果不去注明的话,shell一般是命令行式。shell是传统操作和外部的接口,shell是操作系统的最外层,并且管理用户和操作系统之间的交互,操作系统完成用户的操作,并且处理输出结果。shell实现了用户和系统之间的交互,用户在键盘上输入,并且得到响应,shell基本上算是一个命令解析器吧。
    2)图形界面shell
    目前应用最广的windows操作系统,还有很多Linux shell,并且包含了FluxBox和CDE。
3、shell的分类
    shell的两种主要语法类型有Bourne和C,这两种语法彼此不兼容。Bourne家族主要包括sh、ksh、bash、psh、zsh;C家族主要包括csh、tcsh(bash和zsh在不同程度上支持csh的语法)
4、Shell编程的重要性
    1.Shell编程运维人员使用最多的编程语言
    2.Shell编程可以解决大部分的需求
    3.Shell的作用
        1)安装操作系统(kickstart cobbler自动化部署操作系统 底层调用脚本实现)
        2)优化操作系统(优化SSH 禁止ROOT登录 加大文件描述符 时间同步 Selinux 优化防火墙 YUM仓库..)
        3)服务安装(多台服务器部署、不同的服务安装)
        4)服务配置,写脚本配合Ansible使用
        5)监控(取值+自定义监控)
        6)日志分析、日志统计 、日志切割(文件切割) 脚本+定时任务
5、学习Shell编程必会的技能
    1.vim编辑器
    2.三剑客 awk sed grep | find
    3.Linux常用系统命令
    4.远程连接软件Xshell Crt
6、如何学习Shell编程
    1.基础部分最重要
    shell脚本规范
    Shell执行方式
    变量
    判断 比较表达式
    ...
    2.重复练习(先模仿-->练习-->修改) 自己尝试写需求
    注意: 后面我们写脚本的过程会省略前面相对简单的语法,大家不能省略
    3.编程思维(生活案例)
    4.有一个比较完善的教材或笔记
    5.拿来即用(每行搞明白变为自己的知识)
    6.做好笔记
7、Shell脚本规范
    1.Shell脚本以.sh结尾
    2.脚本开头使用解释器 #!/bin/sh #!/bin/bash
    3.脚本中尽量使用注释说明
    4.脚本中对功能块进行注释说明
    5.shell中尽量不使用中文,不是说不让用,而是有可能出问题
    6.脚本中成对的符号尽量一次性书写完毕,且为英文
    7.语法结构尽量一次性完成
    8.将脚本放在统一的目录下,可以通过功能目录名称分类
1、第一个Shell脚本
    [root@shell script]# cat Hello.sh 
    #!/bin/bash
    echo Hello world
    [root@shell script]# sh Hello.sh 
    Hello world                                            
2、执行脚本的方式
    1)直接用解释器
        sh Hello.sh
        bash Hello.sh
    2) 
        相对:./Hello.sh
        绝对:/server/script/Hello.sh
    3)source或者.
        source Hello.sh
         . Hello.sh
    4)还有这种脱裤子放屁的方式
        echo touch test.txt|bash
1、什么是变量
    用一个固定的值来表示一堆不固定的值称为变量#这个是老师说的我觉得有点抽象,补充一个
    #变量是指在程序运行期间其值可以发生改变的量
    name=aoligei name=zs name=li
    age=18 age=20 age=100
2、系统变量的分类
    第一种: 系统变量(全局变量) 
    第二种: 普通变量(局部变量) 
    查看系统变量:
        [root@shell script]# env
        XDG_SESSION_ID=56
        HOSTNAME=shell
        TERM=xterm
        SHELL=/bin/bash
        HISTSIZE=1000
        SSH_CLIENT=10.0.0.2 62477 22
        SSH_TTY=/dev/pts/0
        USER=root
        ...#省略,太多了
        [root@shell script]#  echo $USER
        root
        [root@shell script]# echo $SHELL
        /bin/bash
        ...

3、变量定义方式:
    系统变量: 写入环境变量配置文件中/etc/profile
    普通变量: 直接使用export定义即可
    [root@shell script]# export name=qxl
    [root@shell script]# echo $name
    qxl
4、环境变量配置文件
    执行的顺序:
    /etc/profile name=qxl
    .bash_profile
    .bashrc
    /etc/bashrc name=zhangsan
5、类似命令行执行: 变量的重复赋值
    [root@shell script]# name=qxl
    [root@shell script]# name=zhangsan
    [root@shell script]# echo $name
    zhangsan
6、父Shell和子shell的区别#这一块解释有点抽象,不好理解看看其他神仙写的
    父Shell: 一个shell就是一个解释器,登录后的第一个shell称为父shell
    子shell: 执行bash sh都会调用生成一个子shell 执行完成后子shell消失
    子shell可以继承父shell的变量
    父shell不可以继承子shell的变量(前提不加export,加了export就可以使用了)
7、定义变量加export和不加export的区别
    加export可以让当前登录窗口的所有的子shell生效
    不加export只对当前的shell生效
1、变量定义
    变量名称定义:
    格式: 使用字母下划线和数字的组合
    不能以数字开头,可以以下划线和字母开头
    等号两端不允许有空格
    见名只其意
    名称的书写方式:
    NAME_AGE 全大写#学编程时一般这种都是定义全局变量或者常量使用
    name_age 全小写
    Name_Age 大驼峰
    name_Age 小驼峰
    变量值:
    注意: 字符串和数字都是连续的,如果不连续必须使用引号
    单引号: 不能解析变量所见即所得
    双引号和不加引号: 可以解析变量
    1)字符串 test=zs、 name=$test_123
    2)路径  dir=/etc/sysconfig/network-scripts/
    3)命令 time=`date +%F`、time=$(date +%F)#这种用那种自动生成目录或者日志用的挺ok
2、内置变量
    $? # 表示上一个命令执行的结果,0为成功,非0失败
    $$ # 表示脚本的PID号
    $! # 表示上一个执行脚本的PID号 调试脚本使用
    1)第一个可以用在执行一个命令只取执行的结果
    2)没求用
    3)第三个是执行的脚本名称相同就可以用这个命令获取上一个执行的脚本pid直接操作进程
    了解:#这几个更没球用
    $* 表示所有参数 在循环体中加双引号和$@不同 输出为独立的参数
    $@ 表示所有参数 在循环体中加双引号和$*不同 输出为单个参数
    $_ 表示最后一个参数
传参
1[root@shell script]# cat cc.sh 
    #!/bin/bash

    echo $1
    #直接将脚本后面的字符串传到$1输出
    [root@shell script]# sh cc.sh qxl
    qxl
    #根据$后面的数字的顺序输出
    [root@shell script]# cat cc.sh 
    #!/bin/bash
    echo $1
    echo $2
    [root@shell script]# sh cc.sh qxl 13
    qxl
    13
    #键值对那种也是一样前面直接加字符串等于号就行了
    
    ·#案例
    [root@shell script]# sh ping.sh baodi.com
    ping baodi.com Y
    [root@shell script]# cat ping.sh 
    #!/bin/bash
    url=$1
    [ $? -eq 0 ] && echo ping $url Y || echo ping $url N  # Y 就是通 N 就是不通

2、read
    #这个read同java的Scanner是一个意思,等待用户输入,用变量去接收
    [root@shell script]# cat read.sh 
    #!/bin/bash
    read -p "请输入你的年龄: " name
    echo name=$name
    [root@shell script]# sh read.sh 
    请输入你的年龄: 13
    name=13
    #补充 -s 这个参数可以隐藏输入的值,就像 html  或者linux输入登录密码
    
    使用三种传参: 修改主机名称
    sh rename.sh test01 # 主机名称被修改为test01
    sh reip.sh 201 # 主机IP地址被修改为10.0.0.201[root@shell script]# sh zy.sh test01
    [root@shell script]# cat zy.sh 
    #!/bin/bash
    hostnamectl set-hostname $1
    #运行完了直接好使
    [root@test01 ~]# test[root@test01 script]# sh zy.sh test02
    [root@test01 script]# cat zy.sh 
    #!/bin/bash
    name=$1
    hostnamectl set-hostname $name
    #这个我愿称之为第二种脱裤子放屁[root@test02 script]# cat zy.sh 
    #!/bin/bash
    read -p "主机名:" name
    hostnamectl set-hostname $name
    #这个还算有点用
    
    #改ip就不做了一个原理,不过这个得用sed替换一下
字符串操作
1、name=123456     echo ${name:2:2}#字符串切片,从第二个开始取两个
2、求长度
    echo $name|wc -L
    [root@test02 script]# name=1234567~7~
    [root@test02 script]# expr length $name
    10
    
    echo $name|awk '{print length}'
    
    echo ${#name}
    #四种,可能笔试
3、统计字符串小于3的输出到屏幕
    #!/bin/bash
    for i in I am quxilong I am 18
    do
    [ ${#i} -lt 3 ] && echo $i
    done
    
    echo I am quxilong I am 18|xargs -n1|awk '{if(length<3)print}
    
    echo I am quxilong I am 18|awk '{for(i=1;i<=NF;i++)if(length($i)<3)print $i}'
    
    #有可能笔试,多记几种,看主机名变了吗,上面的题改的

你可能感兴趣的:(云计算,运维)