shell基础

         

1.shell基本概述
2.shell变量定义variables
3.shell数值运算expr bc
4.shell流程控制if case
5.shell循环语句for while
6.shell数组 函数 array function
7.shell内置命令break continue exit
8.shell项目
9.shell正则表达式 sed awk

========================================
1.什么是shell
命令解释器,位于系统最外层,负责人机对话:命令的翻译输入和处理结果输出

2.什么是shell脚本
将系统命令放在一起,顺序执行,即系统命令堆积;
特定格式、特定语法、系统命令,共同组成的文件

3.shell脚本能做什么
基础配置:系统初始化操作、系统更新、内核调整、网络、时区
安装程序:部署LNMP、LAMP、LMT、mysql、nginx、Redis
配置变更:nginx conf、PHP conf、mysql conf、Redis conf 
业务部署:shell配合git、jenkins实现自动化部署以及回滚
日常备份:使用shell脚本对mysql进行全备和增备
信息采集:zabbix+shell,硬件、系统、服务、网络
日志分析:取值、排序、去重、统计、分析
服务扩容:监控脚本监控服务器集群cpu使用率,超出80%触发动作脚本
        (调用api开通云主机,初始化、加集群)
服务缩容:监控脚本监控服务器集群cpu使用率,低于20%触发动作脚本
        (查看节点数,判断预设值,释放节点)
总结:简化工作,避免重复性、周期性操作,减少故障几率

4.学习shell需要哪些知识
熟练vim辑编器
熟练Linux命令
熟练Linux三剑客grep sed awk 
学习方法:基础命令、基础服务、大量练习、思路

5.shell基本规范
脚本存放在固定目录
开头#!/bin/bash,指定命令解释器
作者和版本
扩展名.sh,便于识别
复杂脚本,添加必要注释
成对符号一次书写完成  
循环格式一次性输入完成
脚本中文件必须使用绝对路径


vim test1.sh 
#!/usr/bin/bash
    脚本中不写,如果./执行,默认调用bash翻译 
    脚本中写了解释器,使用./执行直接调用相应解释器

shell脚本五种运行方式
1.  ./脚本名      相对路径方式运行必须有x权限
2.  sh 脚本名
3.  source 脚本名 以root身份运行可以没有x权限
4.  . 脚本名
5.  /sh/test.sh   绝对路径方式运行必须有x权限

    
--------------------------------------------
shell变量

一.shell变量概述 *
变量是shell传递数据的一种方法,即用一个固定的字符串去表示不固定的值,便于后期引用


二.变量命名规范 *
命名要求:字母、数字、下划线组成,字母开头(不能使用数字开头)

类型:字符类型(不能用于计算)、数值类型(可以计算)
符号:'' 单引号  "" 双引号  `` 反撇号
'' 表示字符串(不对变量进行解释)
"" 表示字符串(对变量进行取值操作)
`` 反撇号 表示将一个命令的执行结果赋值给一个变量(不能嵌套使用) 
$() 表示将一个命令的执行结果赋值给一个变量(可以嵌套)  $($()) 可以使用

注意:所有符号必须是英文符号 () () '' ‘’


变量名尽量具备一定含义,但不要和系统命令冲突;等号赋值,两边不能空格
例1:
    ip=192.168.1.100            #不要和已有的系统命令冲突
    HostName_Ip=192.168.1.100    #推荐驼峰式命名
    
例2:
    HostName=$(hostname)
    echo $HostName
    
三.shell变量定义的方式 **
用户自定义变量:人为定义变量名称
系统环境变量:系统操作环境相关数据
位置参数变量:向脚本传递参数,名称固定,作用固定
预定义变量:bash定义好的变量,名称固定,作用固定

1、用户自定义变量,当前shell有效

(1) 变量名不能出现"-"横杠,变量值有空格需要引号括起来
    var="hello world"

(2) 引用变量,$变量名 或 ${变量名}
    echo $var 
    echo $var_log    #变量无法引用
    echo ${var}_log    #变量可以引用
    注意:在变量链接字符串时,需要将变量使用{}阔起
    
(3) 查看变量,set显示所有变量(自定义和环境变量)
    set | grep var 

(4) 取消变量,作用范围:当前shell
    unset var 
    
(5) 引用变量,"" 双引号属于弱引用,‘’单引号属于强引用 ***
    echo "$var hello china"        #需要引用变量值
    echo '$var hello china'        #只想引用变量名,不执行$特殊符号
    echo "$var hello china \$SHELL"  #部分变量执行,部分变量不执行

(6) 变量命令赋值,使用``或$() ***
    Ip=`ifconfig ens33 | grep "inet" |grep -v inet6 |awk '{print $2}'`
    或
    Ip=$(ifconfig ens33 | grep "inet" |grep -v inet6 |awk '{print $2}')
    
2、系统环境变量

(1) 使用系统已定义好的变量
    export 
    echo "宿主目录: $HOME"
    echo "当前目录: $PWD"
    echo "主机名: $HOSTNAME"
    echo "客户端地址和端口: $SSH_CONNECTION"
    
    环境变量配置文件:/etc/profile (全局配置文件)
                      /root/.bash_profile (root用户的局部配置文件)
                      /home/test/.bash_profile (test用户的局部配置文件)
    
    

(2) 自定义环境变量
    var2="hello beijing"        #定义局部变量,子shell不识别
    cat >> env1.sh << EOF
    #!/bin/bash
    echo $var2 
    EOF
    sh env1.sh 
    
    export var2                    #把局部变量发布到全局,子shell也识别
    
3、 预定义变量 **
    vim  variable.sh 
    #!/bin/bash 
    echo "当前shell脚本的文件名:$0"
    echo "第1个shell脚本位置参数:$1"
    echo "第2个shell脚本位置参数:$2"
    echo "第3个shell脚本位置参数:$3"
    echo "第10个shell脚本位置参数:${10}"
    echo "所有传递的位置参数:$*"
    echo "所有传递的位置参数:$@"
    echo "总共传递的参数数量:$#"
    echo "当前程序运行的PID:$$"
    echo "上一个命令执行的返回结果:$?"  0成功  非0都是失败
    
    sh variable.sh 11 22 33 44 55 66 77 88 99 100
    
    
    $* 和 $@ 的区别: **
        不加引号两者结果相同;加引号,$*把参数作为整体,$@把参数作为分散个体。
    vim variable2.sh
    #!/bin/bash
    test() {
            echo "未加引号,两者相同"
            echo $*
            echo $@
            
            echo "添加引号,两者对比"
            
            echo "----"\$*----""
                for I in "$*"
                do
                    echo $I
                done
            echo "----"\$@----""
                for I in "$@"
                do
                    echo $I
                done                
    }
    test 11 22 33 44
    
    sh variable2.sh
    
4、 位置变量是预定义变量的一部分,是定义脚本后的参数位置的
    $1 
    $2 
    $3 
    .
    . 
    $9 
    ${10}
    
5、 补充:将命令执行结果传给变量(命令替换)
例1:打印今年和明年的时间
    echo "今年是 $(date +%Y) 年"
    echo "明年是 $(($(date +%Y)+1)) 年"
    
例2:命令的嵌套使用
    Back=$(tar zcf /backup/root.tar.gz $(find /root/ -name "*.txt"))
    echo $Back

    
测试命令
    test 
    数值测试:
    -eq    等于则为真
    -ne    不等于则为真
    -gt    大于则为真
    -ge    大于等于则为真
    -lt    小于则为真
    -le    小于等于则为真
    字符串测试:
     =    等于则为真
    !=    不相等则为真
    -z 字符串    字符串的长度为零则为真
    -n 字符串    字符串的长度不为零则为真
    文件测试
    -e 文件名    如果文件存在则为真
    -r 文件名    如果文件存在且可读则为真
    -w 文件名    如果文件存在且可写则为真
    -x 文件名    如果文件存在且可执行则为真
    -s 文件名    如果文件存在且至少有一个字符则为真
    -d 文件名    如果文件存在且为目录则为真
    -f 文件名    如果文件存在且为普通文件则为真
    -c 文件名    如果文件存在且为字符型特殊文件则为真
    -b 文件名    如果文件存在且为块特殊文件则为真

6、shell变量赋值
    除了自定义和环境变量,还可以使用read进行交互式传递变量 ***
    
例1:
    vim read1.sh
    #!/bin/bash
    read -p "请输入备份的目录:"  Dir
    echo "你要备份的目录是: $Dir"
    
    echo "-----backuping $Dir-----"
    echo "-----backup $Dir done-----"
    
    sh read1.sh 
    
例2:
    vim read2.sh
    #!/bin/bash
    back_dir1=/backup
    read -p "请输入你的备份目录:" back_dir2
    echo $back_dir1
    echo $back_dir2
    
例3:
    vim read3.sh
    #!/bin/bash 
    read -p "请输入需要检测的ip地址:" IP
    
    ping -w1 -c1 $IP &> /dev/null
    
    if [ $? -eq 0 ];then
        echo -e  "\033[32m $IP 可以通信 \033[0m"
    else
        echo -e "\033[31m $IP 不可通信 \033[0m"
    fi 
    
vim read3-2.sh    ***
#!/bin/bash
IP=192.168.8.
for i in {1..254}
do
ping -w 1 -c 1 ${IP}$i &> /dev/null
if [ $? -eq 0 ];then
    echo -e "\033[32m ${IP}$i 可以通信 \033[0m"
else
    echo -e "\033[31m ${IP}$i 不可通信 \033[0m"
fi
done

例4:使用read修改主机名和ip
    vim read4.sh 
    #!/bin/bash
    read -p "请输入你想修改的主机名:" HostName
    read -p "你确定要修改如下内容,[Y|N]" RC
    
    if [ $RC == "Y" ];then
        hostnamectl set-hostname $HostName
    else 
        exit 
    fi 
    
    
四、脚本题

1.在每月第一天备份并压缩/etc目录的所有内容,放到/backup,备份文件以时间戳命名。
(1) 备份目录在哪,/backup 
(2) 备份目标是谁,/etc 
(3) 命令,tar 
(4) 时间戳命名,$(date +%F)

vim  backup.sh ***
#!/bin/bash
Back_dir=/backup

if [ -d $Back_dir ];then
    tar zcf $Back_dir/etc_$(date +%F).tar.gz /etc 
else
    mkdir /backup && tar zcf $Back_dir/etc_$(date +%F).tar.gz /etc 
fi


crontab -e
30 23 1 * * /bin/bash /sh/backup.sh 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值