Shell第一天

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.日常备份:使用shell脚本对MySQL进行每晚的全量与增量备份
6.信息采集:Zabbix + shell,硬件、系统、服务、网络、等等
7.日志分析:取值->排序->去重->统计->分析
8.服务扩容:扩容,监控服务器集群cpu,如果负载持续80% + 触发动作(脚本);脚本调用api开通云主机->初始化环境->加入集群->对外提供
9.服务缩容:监控服务器集群cpu使用率--低于20%-->检测当前有多少web节点--判断是否超过预设定--缩减至预设定状态--变更负载配置

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


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

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

1.需要的预备知识
    1.熟练使用vim编辑器
    2.熟练使用linux命令
    3.熟练使用三???2.如何才能学好shell脚本
    1.基础命令+基础服务+练习+思路 (必备)
    2.能看懂shell脚本+能修改shell脚本+编写shell脚本+优化脚本

5.shell脚本的书写方式

1.shell脚本命名

名字要有意义,不要使用abcd123这种方式命名;虽然说Linux系统中,文件没有名字的概念,依然建议你使用 。sh结尾,名字不要太长,最好是能在30个字节内解决

2.shell脚本格式

脚本开头必须指定脚本运行环境 ,以#!这个特殊符号组合组成例如: #!/usr/bin/bash

3.shell脚本里面 # 的应用

#   注释,主要是用来描绘我们的shell脚本使用的方式

6.shell脚本执行方式

1.当我们给脚本加上执行权限之后,可以 . / 运行

2.如果不希望赋予脚本执行权限,那么可以使用bash命令来运行未给予权限的脚本

!/usr/bin/bash 驾驭不加的区别

1.如果你明确清除这是一个什么类型的脚本,直接调用对应的解释器执行,没有影响

2.如果你不清楚是什么类型的脚本,直接而是用 . / 执行,那么会读取该脚本的指定的解释器,如果没有指定,那么默认会使用bash翻译

书写方式

!/usr/bin/bash

!/usr/bin/sh

!/usr/bin/env bash

!/usr/bin/env python

PS: env会主动寻找命令解释器所在的路径

本章课程

1. 什么是变量variables?

变量是shell 中传递数据的一种方法。

简单理解,变量就是用一个固定的字符串,去表示一个不固定的值。

2.变量的规范

1.大写开头,后面小写或数字都ok

2.变量具有一定的含义

3.白能量的写法 A=1 等于不能有空格

2.Shell变量定义

1.变量定义方式

1.用户自定义变量:认为定义变量名与变量的值
2.系统环境变量:保存的是和系统操作环境相关的数据,所有用户都可以使用
3.位置参数变量:像脚本中进行参数传递,变量名不能自定义,变量作用是固定的
4.预定义的变量:是Bash中已定义好的变量,变量名不能自定义,变量的作用也是固定的。

2.用户自定义变量实例,当前shell有用

export 可以将自定义变量转换为全局变量

3.预先定义的变量参数实例,系统内置变量

$0      当前shell脚本的文件名
$1      第一个shell脚本位置参数
$2      第二个shell脚本位置参数
$3      第三个shell脚本位置参数  
$*      所有传递的位置参数是
$@      所有传递的位置参数是
$#      总共传递的参数个数是
$$      当前程序运行的PID
$?      上一个命令执行的返回结果


$* 与$@的区别,当不加引号时,二者相同
加入引号时,$* 把它当做一个整体
而$@则是把它拆分开来

  1. 通过位置传参的方式,创建Linux系统账号及密码

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

2.通过传参的方式,Linux系统账户及密码,控制最多传递两个参数

[root@manager var_01.sh]# cat 2.sh 
#!/bin/bash
#********************************************************************
#Author: 杨
#QQ: 429007127
#Date: 2019-10-28
#FileName: 2.sh
#URL: http://blog.yangxiaoni.top
#Description: The test script
#********************************************************************


if [ $# -ne 2 ];then
    echo "请传递两个参数 [ username | passwd ]"
    exit
fi

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


3.变量赋值

除了自定义变量,以及系统内置变量,还可以使用read命令通过交互方式传递变量。

read选项 选项含义
-p 打印信息
-t 限定时间
-s 不回显
-n 指定字符个数

使用read方式进行系统登陆

[root@manager var_01.sh]# cat 3.sh 
#!/bin/bash
#********************************************************************
#Author: 杨
#QQ: 429007127
#Date: 2019-10-28
#FileName: 3.sh
#URL: http://blog.yangxiaoni.top
#Description: The test script
#********************************************************************

read -p "Login: " acc
read -n6 -t50 -s  -p "Passwd: " pw

echo "你输入的用户名是:$acc"
echo "你输入的密码是:$pw"


需求1:使用read模拟Linux登陆页面

[root@manager var_01.sh]# cat 4.sh 
#!/bin/bash
#********************************************************************
#Author: 杨
#QQ: 429007127
#Date: 2019-10-28
#FileName: 4.sh
#URL: http://blog.yangxiaoni.top
#Description: The test script
#********************************************************************


echo "hostnamectl | awk -F ":" '/System/{print $2}'"
echo "hostnamectl | grep "Kernel""

read -p "manager Login: " acc
read -s -t50 -p "Password: " pw
echo ""

echo "你输入的用户名: $acc 你输入的密码是: $pw"


需求2.用read备份数据

[root@manager var_01.sh]# cat 5.sh 
#!/bin/bash
#********************************************************************
#Author: 杨
#QQ: 429007127
#Date: 2019-10-28
#FileName: 5.sh
#URL: http://blog.yangxiaoni.top
#Description: The test script
#********************************************************************

 read -p "请输入要备份的源:" bf
 read -p "情输入要备份到哪里去:" mb
 read -p "确认是否备份 [ y | n ]: " Action

 if [ $Action == y ];then
    cp -rpv $bf $mb
 fi


需求3:使用read编写一个探测主机存活

[root@manager var_01.sh]# cat 6.sh 
#!/bin/bash
#********************************************************************
#Author: 杨
#QQ: 429007127
#Date: 2019-10-28
#FileName: 6.sh
#URL: http://blog.yangxiaoni.top
#Description: The test script
#********************************************************************

read -p "请输入要测试的主机ip:" Ip

ping -W1 -c1 "$Ip" &> /dev/dull

if [ $? -eq 0 ];then
    echo "该主机可以通"
else
    echo "该主机不可以通讯"
fi


需求4: 修改主机名称

[root@manager var_01.sh]# cat 7.sh 
#!/bin/bash
#********************************************************************
#Author: 杨
#QQ: 429007127
#Date: 2019-10-28
#FileName: 7.sh
#URL: http://blog.yangxiaoni.top
#Description: The test script
#********************************************************************


echo "当前主机名称是: $(hostname)"
read -p "请输入要修改的主机名:" Hostname

read -p "你确定要将 $(hostname) 变更为 $(Hostname) 吗?[ y | n ]" Action

if [ $Action == "y" ];then
    hostname ${Hostname}
    hostnamectl set-hostname $Hostname
    echo "你的主角名称已修改成功"
fi


4.shell变量替换

1.什么是变量替换?

简单来说,就是在不改变原有的变量的情况下,对白能力进行替换。

2.为什么要用变量替换

例如:我们需要对某个变量的值进行整数比对,单变量的值是一个小鼠。怎么办?我们可以使用变量替换的方式,将小数位进行删除,然后再进行比对。

3.变量替换的几种方式

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

实例:

------------#
[root@manager ~]# echo ${url#*.}        #从头开始匹配,最短匹配
sina.com.cn 
[root@manager ~]# echo ${url##*.}       #从头开始匹配,最长匹配
cn

------------%
[root@manager ~]# echo ${url%.*}
www.sina.com
[root@manager ~]# echo ${url%%.*}
www

-------------/
[root@manager ~]# echo ${url/c/C}
www.sina.Com.cn
[root@manager ~]# echo ${url//c/C}
www.sina.Com.Cn


需求2:变量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 variables]# cat var12.sh 
#!/bin/bash
# Author:      Oldux.com QQ: 552408925
# Date:       2019-10-28
# FileName:   var12.sh
# URL:         https://www.xuliangwei.com
# Description: 
string="Bigdata process is Hadoop, Hadoop is open source project"

echo $string
echo "1)、打印string长度"
echo "2)、删除字符串中所有的Hadoop"
echo "3)、替换第一个Hadoop为Linux"
echo "4)、替换全部Hadoop为Linux"
read -p "请输入对应的选项 [ 1 | 2 | 3 | 4 | q ] " Action

if [ $Action -eq 1 ];then
    echo "他的长度是: ${#string}"
fi

if [ $Action -eq 2 ];then
        echo "${string//Hadoop/}"
fi

if [ $Action -eq 3 ];then
    echo ${string/Hadoop/Linux}
fi

if [ $Action -eq 4 ];then
    echo ${string//Hadoop/Linux}
fi

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

    1.当前内存使用百分比是多少
    2.进行判断比对  
        如果大于80%  则触发邮件
        否则,over
        已使用的内存  /  总内存  * 100 = 使用的百分比
        
mem_use=$(free -m | awk '/^Mem/ {print $3/$2*100}')
if [ ${mem_use%.*}  -ge 10 ];then
    echo "你的内存已经超过了80%  目前的内存使用状态是 ${mem_use}%"
fi


需求1:根据系统时间,打印今年和明年时间。
[root@manager variables]# cat var14.sh 
#!/bin/bash
# Author:      Oldux.com QQ: 552408925
# Date:       2019-10-28
# FileName:   var14.sh
# URL:         https://www.xuliangwei.com
# Description: 

echo "今年的时间是: $(date +%Y)"
echo "明年的时间是: $(( $(date +%Y) +1 ))"

需求2:根据系统时间获取今年还剩下多少星期,已经过了多少星期。思路如下:
date +%j 已经过了多少天

一年有365天   已经过了 301 = 还剩下   365-301 = 64  / 7 = 还剩下多少周
              已经过了 301 天 / 7 = 已经过了多少周
              
[root@manager variables]# cat var15.sh 
#!/bin/bash
# Author:      Oldux.com QQ: 552408925
# Date:       2019-10-28
# FileName:   var15.sh
# URL:         https://www.xuliangwei.com
# Description: 
Date=$(date +%j)

echo "今年已经过了 ${Date}   天"
echo "今年已经过了 $[ ${Date} /7 ] 周"
echo "今年还剩下 $[ ( 365 - ${Date} ) / 7 ]  周"
echo "从现在距离下一个新年还有  $[ 365 - ${Date} ]  天"

需求3:完成一个计算器功能: 传入2个值,然后对传入的值进行 加 减 乘 除,思路如下:

    1.使用read让用户传值:     $1 $2
    2.对传入的值进行运算:
    3.输出对应的结果.
[root@manager variables]# cat var16.sh 
#!/bin/bash
# Author:      Oldux.com QQ: 552408925
# Date:       2019-10-28
# FileName:   var16.sh
# URL:         https://www.xuliangwei.com
# Description: 

echo "$1 + $2 = $[ $1 + $2 ]"
echo "$1 - $2 = $[ $1 - $2 ]"
echo "$1 * $2 = $[ $1 * $2 ]"
echo "$1 / $2 = $[ $1 / $2 ]"
echo "$1 % $2 = $[ $1 % $2 ]"


?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,100评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,308评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,718评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,275评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,376评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,454评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,464评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,248评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,686评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,974评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,150评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,817评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,484评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,140评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,374评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,012评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,041评论 2 351

推荐阅读更多精彩内容

  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,380评论 0 5
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,737评论 0 10
  • 一. Shell介绍:命令的集合 用户,shell,内核关系:1.png 基本简介(1)#!指明解释器 与 ...
    站立着的心X阅读 287评论 0 0
  • 第 2 章 SHELL 基础知识2.1 shell脚本我们在上面简单介绍了一下什么是shell脚本,现在我们来进一...
    LiWei_9e4b阅读 1,562评论 0 0
  • 一,shell题记 不懂shell的程序员不是好程序员,学习shell是为了自动化,使用自动化可以非常有效的提高工...
    架构师小秘圈阅读 8,723评论 3 70