• shell编程_基础&变量


    Shell课程大纲 

    • 1.Shell
    • 2.Shell 脚本
    • 3.SHell 变量
    • 4.Shell 流程控制 if
    • 5.Shell 流程控制 case
    • 6.Shell 循环控制 for while
    • 7.Shell 循环控制 break continue exit
    • 8.Shell 函数 function
    • 9.Shell 数组
    • 10.正则表达式 [] . + $ ^
    • 11.grep sed awk 编程语言
    • 12.Shell相关题_脚本

    1.什么是Shell

    shell是一个命令解释器, 将人类输入高级语言, 通过 Shell程序 转换为 二进制 .

    shell分为两种使用方式:

    • 交互: 登录 执行命令 退出
    • 非交互: 执行某个文件, 文件中都是一推命令, 整个文件从上往下依次执行.

    2.什么是Shell脚本

    • 1) 将系统命令堆积在一起,顺序执行(简称: 系统命令堆积)
    • 2) 特定的格式 + 特定的语法 + 系统的命令 = 文件。 Shell脚本 if for ...

    Shell脚本能做什么,标准:

    • 1.安装方式一致
    • 2.安装路径一致
    • 3.目录结构一致
    • 4.日志格式一致
    • 5.脚本路径一致
    • 能将平时操作脚本化,流程化,自动化 ITIL
    • ppt   人   流程   技术/工具
    • 备份、监控、自动化上线、约束标准

    shell脚本需要的预备知识

    shell脚本如何才能学好 思路 练习 分享 

    Shell脚本编写规范、执行方式。

    • 执行方式分为两种:
    • 1.加执行权限 ./script_filename.sh
    • 2.通过bash直接翻译 bash script_filename.sh
    • #!/usr/bin/bash 加与不加区别在哪?
      1.如果你明确清楚这是一个什么类型的脚本,直接调用对应的解释器执行,没有影响?
      2.如果你不清楚是什么类型的脚本, 直接使用./执行,那么会读取该脚本的第一行
      如果第一行是#!/usr/bin/bash 或者 没有写该行,那么都将使用默认的bash翻译
      问题: 如果我是一个python脚本,没有写开头,那么执行一定会报错
      因为默认查找的是bash解释器,而我的文件需要用python解释器来翻译.

    • 添加命令解释器的几种方式:
      #!/usr/bin/bash
      #!/usr/bin/sh
      #!/usr/bin/env bash
      #!/usr/bin/env python

    3.变量

    • 1.什么是变量variables?
    • 2.变量命名是否有规范?
    • 3.变量定义的几种方式?
    • 4.变量赋值的方式read?
    • 5.变量删除与替换?
    • 6.变量的整数运算?

    1.什么是变量

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

    2.定义变量规范

    • 1.大写开头,后面小写或数字都ok
    • 2.变量具体一定的含义
    • 3.注意 变量的写法 仅支持 a=1 不支持 a = 1

    3.自定义变量

    • var="hello world"
    • echo $var
    • echo ${var}_log

    $* 和 $@ 的区别?

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

    需求1:通过位置传参方式, 创建 Linux 系统账户及密码,执行 var1.sh username password

    [root@manager variables]# cat var04.sh
    #!/bin/bash useradd $
    1 echo "$2" | passwd --stdin $1 [root@manager variables]# sh var04 username password

     需求2:通过位置传参方式, Linux 系统账户及密码,执行 var1.sh username password,控制最多传递两个参数。 

    [root@manager variables]# cat var05.sh 
    #!/bin/bash
    if [ $# -ne 2 ];then
        echo "USAGE: $0 请传递两个参数  [ username | password ]"
        exit 
    fi
    useradd $1
    echo "$2" | passwd --stdin $1

     需求3:使用read模拟Linux登陆页面。 1.先实现, 无论多low 2.在进行改进

    [root@manager variables]# cat var08.sh 
    #!/bin/bash
    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"

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

    [root@manager variables]# cat var09.sh 
    #!/bin/bash
    echo "----------请按照如下提示输入---------------"
    
    read -p "请输入你要备份的源文件或者源目录: " Source
    read -p "请输入你要备份的目录位置是哪里: " Dest
    
    echo -e "	你要备份的源是 $Source
           你要备份的目标是: $Dest"
    read -p "你确定要备份吗? [ y | n ] " Action
    
    if [ $Action == "y" ];then
        cp -rpv $Source $Dest
    fi

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

    • 1.提示用户输入IP地址
    • 2.对用户输入的IP地址进行探测是否存活
    • 3.判断探测结果是否成功 成功则输出成功的结果 失败则输出失败的结果
    [root@manager variables]# cat var10.sh 
    #!/bin/bash
    read -p "请输入需要探测的IP地址: " ip
    
    ping -W1 -c1 "$ip" &>/dev/null
    if [ $? -eq 0 ];then
        echo "$ip" is ok...
    else
        echo "$ip" is err...
    fi

    需求6:使用read编写一个修改系统主机名称脚本。

    • 1.打印当前的主机名称
    • 2.提示用户输入新的主机名称
    • 3.询问用户是否修改?
    • 4.确定修改,执行修改命令
    • 5.不确定修改,退出脚本
    [root@manager variables]# cat var11.sh 
    #!/bin/bash
    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 ~]# echo $PATH
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
    
    [root@manager ~]# echo ${PATH//bin/BIN}

    需求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
    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

     需求4:根据系统时间,打印今年和明年时间。

    [root@manager variables]# cat var14.sh 
    #!/bin/bash
    echo "今年的时间是: $(date +%Y)"
    echo "明年的时间是: $(( $(date +%Y) +1 ))"

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

    一年有365天 已经过了 301 = 还剩下 365-301 = 64 / 7 = 还剩下多少周 已经过了 301 天 / 7 = 已经过了多少周

    [root@manager variables]# cat var15.sh 
    #!/bin/bash
    Date=$(date +%j)
    
    echo "今年已经过了 ${Date}   天"
    echo "今年已经过了 $[ ${Date} /7 ] 周"
    echo "今年还剩下 $[ ( 365 - ${Date} ) / 7 ]  周"
    echo "从现在距离下一个新年还有  $[ 365 - ${Date} ]  天"

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

    思路如下:

    • 1.使用read让用户传值: $1 $2
    • 2.对传入的值进行运算:
    • 3.输出对应的结果.
    [root@manager variables]# cat var16.sh 
    #!/bin/bash
    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 ]"
    作者:三德书生
    所谓知识在于广而习,欣喜同道学习转载所用,祝天下学者知知明智
  • 相关阅读:
    20145228 《信息安全系统设计基础》第十一周学习总结 (1)
    20145228 《信息安全系统设计基础》第十周学习总结 (2)
    20145228 《信息安全系统设计基础》第十周学习总结 (1)
    20145203 《信息安全系统设计基础》课程总结
    20145203 《信息安全系统设计基础》第十四周学习总结
    20145203 《信息安全系统设计基础》第十三周学习总结
    20145203盖泽双 反汇编代码实践
    20145203 《信息安全系统设计基础》第十二周学习总结
    20145203盖泽双《信息安全系统设计》 实验五 网络通信
    20145203盖泽双《信息安全系统设计》实验四 驱动程序设计
  • 原文地址:https://www.cnblogs.com/123456mdy/p/11805096.html
Copyright © 2020-2023  润新知