day56-linux-shell-基础

1.什么是shell?

  • shell是一个命令解释器,在操作系统的最外层,负责桥接与用户进行对话,将用户输入的命令翻译给操作系统,并将处理 的结果输出至屏幕.

  • shell命令存在两种使用方式:

    • 交互式:登录终端,执行命令,返回结果.再次输入命令,等待结果.最后结束工作退出shell会话,当退出shell会话后,当前的shell会话也就终止了.
    • 非交互式:在这种模式下,shell不与你进行交互,而是直接读取某个文件进行执行.当文件从头执行到尾结束后当前的shell也就终止了.

2.什么是shell脚本?

  1. 将命令堆积在一起,顺序启动

  2. 特定的格式+特定的语法+系统的命令=文件

3.shell脚本能做什么?

1.基础配置系统初始化操作系统更新、内核调整、网络、时区、SSH优化

2.安装程序部置LNMP、LNMT、 MySQL. Nginx、 Redis、 ELK等等

3.配置变更: Nginx Conf, PHP Conf, MySQL Conf. Redis Conf

4.业务部署: Shell配合git. jenkins实现自动化部署php. java代码,以及代码回滚

5.日常备份:使用ShellB脚本对MySQL进行每晚的全备与增量备份

6.信息采集Zabbix + Shell,硬件、系统服务、网络、等等

7.日志分析:取值>排序>去重>统计>分析

8.服务扩容扩容监控服务器集群cpu,如cpu负载持续80% +触发动作(脚本) ,脚本调用api开通

9.服务缩容:监控服务器集群cpu使用率, ->低于20%->检测当前有多少web节点>判断是否超过预

设>缩减到对应的预设状态>变更负载的配置

注意:ShellB脚本主要的作用是简化操作步骤提高效率,减少人为干预,减少系统故障

标准:

  1. 安装方式一致
  2. 安装路径一致
  3. 目录结构一致
  4. 日志格式一致
  5. 脚本路径一致

4.shell脚本的相关预备知识?

1.学习shell脚本需要的预备知识

1.熟练使用vim编辑器

2、熟练使用linux基础命令

3、熟练使用linux三剑客

注意如果我们对命令使用不够熟练、对基本服务也不会手动搭建、那么- -定学不会Shell

2.如何才能学好shelI[脚本

1、基础命令+基础服务+练习+思路。( 必备)

2、能看懂Shell脚本-> 能修改Shell脚本->能编写Shell[脚4本-->能优化Shel]脚本

5.shell脚本书写方式

**1. shell脚本命名规则: **

  • 名字要有意义,不要使用a、b. C、1、2、3、这种方式命名;虽然inux系统中,文件没有扩展
    名的概念,依然建议使用.sh 结尾;名字不要太长,最好控制在30个字节之内.
  1. shell脚本格式:
    shell脚本开头必须制定脚本运行环境以#!这个特殊符号组合来组成.
    2. shell脚本中#的使用:

    1 #!/bin/bash
    2 #*********************
    3 #Author: 流星花雨
    4 #QQ: 1679338722
    5 #Date: 2019-10-28
    6 #FileName: var01.sh
    7 #URL: https://www.leitiancheng.cn
    8 #Description: The test script
    9 #*********************

6.脚本的执行方式以及书写规范

1.执行脚本的方式:

  1. 加执行权限 ./script_filename.sh
  2. 通过bash直接翻译 bash script_filename.sh

2.#!/usr/bin/bash 加与不加区别

  1. 如果不明确这是一个什么类型的脚本,直接调用对应的解释器执行,没有影响
  2. 如果你不清楚是什么类型的脚本,直接使用./执行,那么会读取该脚本的第一行
  3. 如果第一行是#!/usr/bin/bash 或者没有写该行,那么都将使用默认的bash翻译
  4. 如果是一个Python脚本,没有写开头,那么执行一定会报错;因为默认使用bash解释器,而我们使用的解释器确是bash.

3.添加命令解释器的几种方式

#!/usr/bin/bash
#!/usr/bin/sh
#!/usr/bin/env bash
#!usr/bin/env python

7.shell变量概述

1.什么是变量

变量是shell中传递数据的一种方法.就是用一个固定的字符串表示不固定的值,便于后续引用.

2.变量命名规范

变量定义命名:大写字母+小写字母+下划线组成,尽量采用字母开头.(变量命名最好携带有一定的含义)

变量定义语法: 变量名=变量值,等号是赋值,需要注意等号两边不能有空格,定义的变量不要与系统命令出现冲突.

3.自定义变量

    var="hello world"
    echo $var
    echo ${var}_log
4. 美元符和美元符@的区别*

不加引号时,而知都是返回传入的参数,但加了引号后,此时*把参数作为一个字符串的整体返回,$@把每个参数作为一个字符串返回

5.什么是变量替换

就是在不改变原有变量的情况下,对变量进行替换

6.为什么要使用变量替换

在需要对某个变量的值进行证书对比,但变量的值是一个小数.我们可以使用替换的方式将小鼠位进行删除,然后再进行证书比对

7.变量替换的几种方式

变量 说明
{变量#匹配规则} 从头开始匹配,最短删除{变量##匹配规则} 从头开始匹配,最长删除
{变量%匹配规则} 从未开始匹配,最短删除{变量%%匹配规则} 从尾开始匹配,最长删除
变量/旧字符串/新字符串} 替换变量内的旧字符串为新字符串一个
${变量//旧字符串/新字符串} 替换变量内的旧字符串为新字符串,全部替换

需求一: 通过为止传参的方式,创建Linux系统账户及密码,执行 var1.sh username password

[root@manager-61 ~]#cat variables/var04.sh 
#!/bin/bash
#*********************
#Author: 流星花雨
#QQ: 1679338722
#Date: 2019-10-28
#FileName: var04.sh
#URL: https://www.leitiancheng.cn
#Description: The test script
#*********************

useradd $1
echo "$2" |passwd --stdin $1

需求二:通过位置传参的方式,创建linux系统用户及密码,执行var.sh username password控制最多传递两个参数

[root@manager-61 ~]#cat variables/var05.sh 
#!/bin/bash
#*********************
#Author: 流星花雨
#QQ: 1679338722
#Date: 2019-10-28
#FileName: var05.sh
#URL: https://www.leitiancheng.cn
#Description: The test script
#*********************
if [ $# -ne 2 ]; then
   echo "USER: $0 请传递两个参数 [ username | password ]"
   echo "不是传递 $# 个参数"
fi
useradd $1
echo "$2 | passwd --stdin $1"

需求三:使用read 迷你linux登录页面

[root@manager-61 ~]#cat variables/var06.sh 
#!/bin/bash
#*********************
#Author: 流星花雨
#QQ: 1679338722
#Date: 2019-10-28
#FileName: var06.sh
#URL: https://www.leitiancheng.cn
#Description: The test script
#*********************

echo -n "Login: "
read acc
echo -n "Password: "
read pw
echo "你输入用户名是: $acc 你输入的密码是: $pw"
------------------------------------------------------
[root@manager-61 ~]#cat variables/var07.sh 
#!/bin/bash
#*********************
#Author: 流星花雨
#QQ: 1679338722
#Date: 2019-10-28
#FileName: var07.sh
#URL: https://www.leitiancheng.cn
#Description: The test script
#*********************

read -p "Login: " acc
read -s -t50 -n6 -p "Password: " pw
echo "你输入的用户名是: $acc 你输入的密码是: $pw"
--------------------------------------------------------
[root@manager-61 ~]#cat variables/var08.sh 
#!/bin/bash
#*********************
#Author: 流星花雨
#QQ: 1679338722
#Date: 2019-10-28
#FileName: var08.sh
#URL: https://www.leitiancheng.cn
#Description: The test script
#*********************

echo "$(hostamectl |awk -F ":" '/Operating System:/ {print $2}')"
echo "Kernel $(uname -r) on an $(uname -m)"
read -p "$(hostname) Login: " acc
read -s -t50 -p "Password: " pw
echo ""
echo "你输入的用户名是: $acc 你输入的密码是: $pw"

需求四:使用read编写一个备份脚本,需要用户传递两个参数,源和目标

[root@manager-61 ~]#cat variables/var09.sh 
#!/bin/bash
#*********************
#Author: 流星花雨
#QQ: 1679338722
#Date: 2019-10-28
#FileName: var09.sh
#URL: https://www.leitiancheng.cn
#Description: The test script
#*********************

echo "------------请按照如下提示输入--------------"
read -p "请输入你要备份的源文件或者目录: " Source 
read -p "请输入你要备份的目录目标位置是: " Dest
echo -e  "\t你要备份的源文件或目录是:"
         "你要备份的目标位置是: " $Dest
read -p "你确定要备份吗? [ y | n ]" Action
if [ $Action == "y "];then
   cp -rpv $Source $Dest
fi 

需求五:使用read编写一个探测主机存活的脚本,需要用户传递测试的IP地址

#1.提示用户输入IP
#2.对用户输入的IP进行探测是否存活
#3.判断探测结果是否成功
   成功则输出成功的结果
   失败则输出失败的结果
[root@manager-61 ~]#cat variables/var10.sh 
#!/bin/bash
#*********************
#Author: 流星花雨
#QQ: 1679338722
#Date: 2019-10-28
#FileName: var10.sh
#URL: https://www.leitiancheng.cn
#Description: The test script
#*********************
 
read -p "请输入需要探测的ip地址: " ip
ping -W1 -c1 "$ip" >/dev/null
if [ $? -eq 0 ];then
   echo "$ip" is ok
else
   echo "$ip" is errors
fi

需求六:使用shell编写一个修改主机名称的脚本

#1.打印当前的主名称
#2.提示用户输入新的主机名称
#3.询问用户是否执行修改命令
#4.确定修改执行命令
#5.不确定,退出脚本
[root@manager-61 ~]#cat variables/var11.sh 
#!/bin/bash
#*********************
#Author: 流星花雨
#QQ: 1679338722
#Date: 2019-10-28
#FileName: var11.sh
#URL: https://www.leitiancheng.cn
#Description: The test script
#*********************

echo "当前的主机名称是: $(hostname)"
read -p "请输入新的主机名称: " new_host
read -p "你确定要将 $(hostname) 变更为 ${new_host} 吗? [ y | n ]" Action
if [ $Action == "y" ];then
   hostname ${new_host}
   hostnamectl set-hostname ${new_host}
   echo "你的主机名称已经修改为 ${new_host}"
fi

-----------------------------变量替换-----------------------------------------------------

需求七:将$PATH中的/bin/替换为/BIN/

[root@manager-61 ~]#cat variables/var12.sh 
#!/bin/bash
#*********************
#Author: 流星花雨
#QQ: 1679338722
#Date: 2019-10-28
#FileName: var12.sh
#URL: https://www.leitiancheng.cn
#Description: The test script
#*********************




echo "${PATH//bin/BIN}"

需求八:变量string="Bigdata process is Hadoop,Hadoop is open source project",执行叫蹦后,打印输出string变量,并给出用户以下选项:

1). 打印string长度

2).删除字符串中所有的Hadoop

3).替换第一个Hadoop为Linux

4).替换全部Hadoop为Linux

用户输入数字1|2|3|4,可以执行对应项的功能

[root@manager-61 ~]#vim variables/var13.sh 

 #Author: 流星花雨
 #QQ: 1679338722
 #Date: 2019-10-28
 #FileName: var13.sh
 #URL: https://www.leitiancheng.cn
 #Description: The test script
 #*********************
 
 
  string="Bigdata process is Hadoop, Hadoop is op    en source project"
  echo "1)、打印string长度"
  echo "2)、删除字符串中所有的Hadoop"
  echo "3)、替换第一个Hadoop为Linux"
  echo "4)、替换全部Hadoop为Linux"
  read -p "请输入对应的数字: [ 1 | 2 | 3 | 4 ]" A    ction
  if [ ${Action} == 1 ];then
     echo "${#string}"
  fi
  if [ ${Action} == 2 ];then
     echo "${string//Hadoop/}"
  fi
  if [ ${Action} == 3 ];then
     echo "${string/Hadoop/Linux}"
  fi
  if [  ${Action} == 4 ];then
     echo "${string//Hadoop/Linux}"
  fi

需求九:查看内存/当前使用状态,如果使用率超过80%则报警发邮件

#1.当前内存使用的百分比
#2.进行判断比对
   如果大于80% 则会触发邮件
   否则,over
   [root@manager-61 ~]#cat variables/var14.sh 
#!/bin/bash
#*********************
#Author: 流星花雨
#QQ: 1679338722
#Date: 2019-10-28
#FileName: 14.sh
#URL: https://www.leitiancheng.cn
#Description: The test script
#*********************


Free=$(free -m | awk '/Mem:/ {print $3/$2*100}')
echo "${Free%.*}"
if [ ${Free%.*} -ge 10 ];then
   echo  "当前占用内存: ${Free} 已超过80%"
fi

需求十:根据系统时间打印今年的时间和明年的时间

[root@manager-61 ~]#cat variables/var15.sh 
#!/bin/bash
#*********************
#Author: 流星花雨
#QQ: 1679338722
#Date: 2019-10-28
#FileName: var15.sh
#URL: https://www.leitiancheng.cn
#Description: The test script
#*********************
echo "今年的时间是$(date |awk '{print $6}')"
echo "明年的时间是$(date |awk '{print $6+1}')"

需求十一:根据系统时间获取今年还剩多少星期,已经过了多少星期.

[root@manager-61 ~]#cat variables/var16.sh 
#!/bin/bash
#*********************
#Author: 流星花雨
#QQ: 1679338722
#Date: 2019-10-28
#FileName: var16.sh
#URL: https://www.leitiancheng.cn
#Description: The test script
#*********************
num1=$(date +%j) 
num2=${}
echo "今年已经过了$(date +%j)天"
echo "今年已经过了$(($(date +%j)/7))周"
echo "今年还剩下天$[365-$(date +%j)]天"
echo "今年还剩下周$[(365-$(date +%j))/7]周"

需求十二: 完成一个计算器功能:传入2个值,然后对传入的值进行加减乘除

[root@manager-61 ~]#cat variables/var17.sh 
#!/bin/bash
#*********************
#Author: 流星花雨
#QQ: 1679338722
#Date: 2019-10-28
#FileName: var17.sh
#URL: https://www.leitiancheng.cn
#Description: The test script
#*********************

echo "$1+$2 = $[$1+$2]"
echo "$1-$2 = $[$1-$2]"
echo "$1*$2 = $[$1*$2]"
echo "$1/$2 = $[$1/$2]"
发布了47 篇原创文章 · 获赞 0 · 访问量 560
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 1024 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览