zoukankan      html  css  js  c++  java
  • shell脚本初识


    1、什么是shell

    ​ shell 是一个命令解释器、用户输入命令,解释器负责解释给内核,将处理后的结果反馈给用户。

    2、交互式与非交互式
    • 交互式shell:用户输入命令,解释器解释把处理后的结果反馈给用户的过程称之为交互式。
    • 非交互式shell:shell执行文本中的命令 当执行到文件的末尾 bash退出
      父shell 不能继承子shell变量 子shell可继承父shell变量。
    3、shell脚本的书写规范

    ​ (1) 目录统一
    ​ (2) shell脚本的结尾要以.sh结尾
    ​ (3) 脚本的开头需要有解释器 /bin/bash /bin/sh
    ​ (4) 脚本中需要有作者信息 #Author lzy date version 做什么的
    ​ (5) 脚本每行 或者 一个语句 给一个注释
    ​ (6) shell中的文字尽量使用英文 py都是中文
    ​ (7) 成对的符号一次性书写完毕 语句

    4、shell脚本能做什么?

    ​ 基础配置、安装程序、配置变更、业务部署、日常备份、信息采集、日志分析、服务扩容、服务缩容。

    • shell的主要作用是简化操作步骤,提高效率,减少人为干预,减少系统故障。
    5、shell脚本预备知识

    ​ 1、熟练使用vim编辑器

    ​ 2、熟练使用linux基础命令

    ​ 3、熟练使用linux三剑客

    ​ 4、基础命令+基础服务+练习+思路

    ​ 5、能看懂shell脚本-->修改-->编写

    ​ 练习+思路+分享

    6、#!/usr/bin/bash 加与不加区别在哪?

    ​ 1、如果你明确清楚这是一个什么类型的脚本,直接调用对应的解释器执行

    ​ 2、如果你不清楚这是什么类型的脚本,直接使用./执行,那么会执行该脚本的第一行。如果第一行是#!/usr/bin/bash 或者没有写该行,那么都将使用默认的bash翻译。

    ​ 问题:如果我是Python脚本,没有写开头,那么一定会报错

    ​ 默认查找的是bash解释器,而我的文件需要用Python解释器来翻译。

    7、什么是变量

    ​ 变量是shell中传递数据的一种方法,简单的来说就是用一个固定的字符

    串表示一个不固定的值,便于后续引用。

    8、定义变量的范围

    ​ 1、大写开头,后面小写或者数字都OK

    ​ 2、变量具有一定的含义

    ​ 3、注意变量的写法 仅支持a=1

    • 自定义变量

      var="hello world"

      echo $var

      echo ${var}_log

    • $* 和 $@ 的区别

      可以看到不加引号时,二者都是返回传入的参数,但加了引号后,此时(*把参数作为一个字符串整体(单字符串)返回,)@把每个参数作为一个字符串返回.

    9、示例
    • 01需求1:通过位置传参方式, 创建 Linux 系统账户及密码,执行 var1.sh username password 如:test123 123456
    [root@manager ceshi]# cat var01.sh 
    #!/bin/bash
    #********************************************************************
    #Author:               一个shell小白
    #QQ:                  2226823216
    #Date:                2019-10-28
    #FileName:            var01.sh
    useradd $1
    echo "$2" | passwd --stdin $1
    
    [root@manager ceshi]# bash var01.sh test123 123456
    Changing password for user test123.
    passwd: all authentication tokens updated successfully.
    
    
    • 需求2:通过位置传参方式, Linux 系统账户及密码,执行 var1.sh username password,控制最多传递两个参数。
    [root@manager ceshi]# cat var02.sh 
    #!/bin/bash
    #********************************************************************
    #Author:               一个shell小白
    #QQ:                  2226823216
    #Date:                2019-10-28
    #FileName:            var02.sh
    
    if [$# -ne 2];then
    	echo "USAGE: $0 请传递两个参数 [username |password]"
    	exit
    fi
    useradd $1
    echo "$2" |passwd --stdin $1
    
    [root@manager ceshi]# bash var02.sh twe123 1234
    Changing password for user twe123.
    passwd: all authentication tokens updated successfully.
    

    read 相关知识点实记

    -p 打印信息 -s 限定时间 -

    • 使用read模拟实现Linux登录界面

      1、先实现

      2、再改进

    [root@manager ceshi]# cat var03.sh 
    #!/bin/bash
    #********************************************************************
    #Author:               一个shell小白
    #QQ:                  2226823216
    #Date:                2019-10-28
    #FileName:            var03.sh
    echo "$(hostnamectl |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"
    [root@manager ceshi]# bash var03.sh 
     CentOS Linux 7 (Core)
    Kernel 3.10.0-957.el7.x86_64 on an x86_64
    manager Login: root
    Password:
    你输入的用户名:root 你输入的密码:123456
    
    
    • 2、用read编写一个备份脚本,需要用户传递两个参数,源和目标
    [root@manager ceshi]# cat var05.sh 
    #!/bin/bash
    #********************************************************************
    #Author:               一个shell小白
    #QQ:                  2226823216
    #Date:                2019-10-28
    #FileName:            var05.sh
    echo "----请按照如下提示输入----"
    
    read -p "请输入你要备份的源文件或者源目录: Source
    	你要备份的目标是: $Dest"
    	read -p "你确定要备份吗? [ y | n ] " Action
    
    	if [ $Action == "y" ];then
    		cp -rpv $Source $Dest
    		fi
    
    • 需求3:使用read编写一个探测主机存活脚本,需要用户传递测试的IP地址。
    • 1.提示用户输入IP地址
      2.对用户输入的IP地址进行探测是否存活
      3.判断探测结果是否成功--->成功则输出成功的结果--->失败则输出失败的结果
    [root@manager ceshi]# cat var05.sh 
    #!/bin/bash
    #********************************************************************
    #Author:               一个shell小白
    #QQ:                  2226823216
    #Date:                2019-10-28
    #FileName:            var05.sh
    echo "----请按照如下提示输入----"
    
    read -p "请输入你要备份的源文件或者源目录: Source
    	你要备份的目标是: $Dest"
    	read -p "你确定要备份吗? [ y | n ] " Action
    
    	if [ $Action == "y" ];then
    		cp -rpv $Source $Dest
    		fi
    
    [root@manager ceshi]# vim var06.sh
    [root@manager ceshi]# bash var06.sh 
    请输入需要探测的IP地址: 10.0.0.1       
    10.0.0.1 is erro...
    [root@manager ceshi]# 
    
    • 需求4 使用read编写一个修改系统主机名称脚本。
      1.打印当前的主机名称
      2.提示用户输入新的主机名称
      3.询问用户是否修改?
      4.确定修改,执行修改命令
      5.不确定修改,退出脚本
    [root@manager ceshi]# cat var07.sh 
    #!/bin/bash
    #********************************************************************
    #Author:               一个shell小白
    #QQ:                  2226823216
    #Date:                2019-10-28
    #FileName:            var07.sh
    Hostname=$(hostname)
    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
    
    
    • 变量替换
    [root@manager ~]# url=www.sina.com.cn
    [root@manager ~]# echo $url
    www.sina.com.cn
    [root@manager ~]# echo $url | awk -F '.' '{print $2,$3,$4}'
    sina com cn
    [root@manager ~]# echo ${url}
    www.sina.com.cn
    
    ------------#
    [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
    
    
    • 变量替换之需求1、如何替换 $PATH 中的/bin/替换为/BIN/
    [root@manager ceshi]# echo $PATH
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
    [root@manager ceshi]# echo ${PATH//bin/BIN}
    /usr/local/sBIN:/usr/local/BIN:/usr/sBIN:/usr/BIN:/root/BIN
    [root@manager ceshi]# 
    
    
    • 变量替换之需求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 ceshi]# cat var08.sh 
    #!/bin/bash
    #********************************************************************
    #Author:               一个shell小白
    #QQ:                  2226823216
    #Date:                2019-10-28
    #FileName:            var08.sh
    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 = 使用的百分比
    [root@manager ceshi]# cat var09.sh 
    #!/bin/bash
    #********************************************************************
    #Author:               一个shell小白
    #QQ:                  2226823216
    #Date:                2019-10-28
    #FileName:            var09.sh
    mem_use=$(free -m |awk '/^Mem/ {print $3/$2*100}')
    if [ ${mem_use%.*} -ge 10 ];then
    	echo "你的内存已经超过了百分之80 目前内存使用状态是 ${mem_use}%"
    fi
    
    
    [root@manager ceshi]# bash var09.sh 
    你的内存已经超过了百分之80 目前内存使用状态是 10.9053%
    
    
    • 需求1、根据系统时间,打印今年和明年时间
    • 需求2、根据系统时间获取今年还剩下多少星期,已经过了多少星期。思路如下:date +%j 已经过了多少天
    • 需求3、完成一个计算器功能: 传入2个值,然后对传入的值进行 加 减 乘 除
    [root@manager ceshi]# cat var10.sh 
    #!/bin/bash
    #********************************************************************
    #Author:               一个shell小白
    #QQ:                  2226823216
    #Date:                2019-10-28
    #FileName:            var10.sh
    echo "今年的时间是: $(date +%Y)"
    echo "明年的时间是: $(( $(date +%Y) +1 ))"
    
    Date=$(date +%j)
    
    echo "今年已经过了 ${Date}   天"
    echo "今年已经过了 $[ ${Date} /7 ] 周"
    echo "今年还剩下 $[ ( 365 - ${Date} ) / 7 ]  周"
    echo "从现在距离下一个新年还有  $[ 365 - ${Date} ]  天"
    
    
    read -p "请输入第一个数字:" num1
    read -p "请输入第二个数字:" num2
    echo "$num1+num2=$[$num1+num2]"
    echo "$num1-num2=$[$num1-num2]"
    echo "$num1*num2=$[$num1*num2]"
    echo "$num1/num2=$[$num1/num2]"
    
    [root@manager ceshi]# bash var10.sh 
    今年的时间是: 2019
    明年的时间是: 2020
    今年已经过了 301   天
    今年已经过了 43 周
    今年还剩下 9  周
    从现在距离下一个新年还有  64  天
    请输入第一个数字:123
    请输入第二个数字:123
    123+num2=246
    123-num2=0
    123*num2=15129
    123/num2=1
    
    
  • 相关阅读:
    js处理数学经典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一 对兔子,假如兔子都不死,问每个月的兔子总数为多少?
    js的水仙花数的输出
    js中关于一个数组中最大、最小值以及它们的下标的输出的一种解决办法
    通过HMI显示西门子SINAMICS V90伺服驱动器报警代码和报警信息
    outlook Archive 归档减小服务器文件夹大小
    西门子触摸屏TP,KTP的报警历史记录数量
    解决HP ZBOOK 蓝屏, 释放静电的方法
    LOGO! 8.2 与 WinCC之间以太网通信的地址对应关系
    Windows10 文件索引功能,替代everything
    行星减速机的精度和强度
  • 原文地址:https://www.cnblogs.com/wangyongqiang/p/11755289.html
Copyright © 2011-2022 走看看