美文网首页
作业-第07周--课堂-Day28-Shell与Shell编程相

作业-第07周--课堂-Day28-Shell与Shell编程相

作者: MineG | 来源:发表于2019-04-14 14:47 被阅读0次

    Day28 课堂作业

    1. Shell与Shell编程相关

    1.1 为什么要学习Shell编程?

    Linux系统中会大量的使用Shell,工作中我们也需要自动化实现业务
    例如:自动备份、监控、自动安装服务。

    Shell编程是Linux运维人员必须要会的编程语言。最简单的编程语言。
    编程也是运维人员必须具备的本领:
    Shell、Python是运维人员必须具备的本领

    1.2 什么是Shell?

    Shell就是一个命令解释器(翻译官),命令行的命令以及脚本都会通过shell解释,传给操作系统,处理后在输出给用户。

    例如:

    [root@oldboyedu ~]# tail -1 /etc/passwd
    oldgirl1:x:8889:8889::/home/oldgirl1:/bin/bash #<==创建用户时,系统指定的翻译官。
    

    1.3 Shell的分类

    1. Bourne shell

    Bourne shell又包括Bourne shell (sh)、Korn shell (ksh)、Bourne Again Shell(bash)三种类型。

    2. C shell

    C shell又包括csh、tcsh两种类型。

    CentOS7支持的shell:

    [root@oldboyedu ~]# cat /etc/shells 
     /bin/sh
    /bin/bash
    /usr/bin/sh
    /usr/bin/bash
    #/bin/sh是bash的软连接
    

    CentOS7:默认Shell

    [root@oldboyedu ~]# echo $SHELL 
    /bin/bash
    

    1.4 什么是Shell脚本?

    程序、命令放入文件里执行,这个文件称之为Shell脚本文件。工作中最多的编程写脚本,存放在文件里。

    1.5 Shell变量:

    1.)全局变量(环境变量)

    在整个系统中生效、一般是大写、系统中默认就
    存在一些这样的变量,满足系统和程序运行的需求。

    a、系统自带的环境变量:

    [root@oldboyedu ~]# echo $PS1
    [\[\e[34;1m\]\u@\[\e[0m\]\[\e[32;1m\]\H\[\e[0m\]\[\e[31;1m\] \w\[\e[0m\]]\$
    
    [root@oldboyedu ~]# echo $PATH
    /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
    
    [root@oldboyedu ~]# echo $HOME
    /root
    [root@oldboyedu ~]# echo $SHELL
    /bin/bash
    [root@oldboyedu ~]# echo $UID
    0
    

    b、自定义环境变量:

    方法1:

    export OLDBOY="I am oldboy."
    

    方法2:

    OLDBOY="I am oldboy."
    export OLDBOY
    

    实例:

    [root@oldboyedu ~]# export OLDBOY="I am oldboy."
    [root@oldboyedu ~]# echo $OLDBOY
    I am oldboy.
    

    环境变量执行顺序从低到高为:

    /etc/profile==>~/.bash_profile===>~/.bashrc===>/etc/bashrc
    

    推荐以后把环境变量放入/etc/bashrc
    比如:

    [root@oldboyedu ~]# tail -1 /etc/bashrc 
    export OLDBOY="I am oldboy."
    [root@oldboyedu ~]# . /etc/bashrc
    [root@oldboyedu ~]# echo $OLDBOY #<==输出一个变量内容就加$变量名
    I am oldboy.
    

    安装java服务的时候就会配置环境变量。

    2.)局部变量(普通变量)

    是编写Shell脚本最常用的变量。
    用法:变量名=值 比如:a=1

    • 变量名:可以由数字、字母、下划线等组成,但不能是数字开头。

    • = 等号:赋值符,把什么东西给谁。赋值符号两边不能有空格。

    • 值:东西,变量内容。
      引用内容的符号:单引号、双引号、反引号、不加引号

    示例

    [root@oldboyedu ~]# a=1
    [root@oldboyedu ~]# echo $a
    1
    
    [root@oldboyedu ~]# y=$x+1
    [root@oldboyedu ~]# echo $y
    1+1
    [root@oldboyedu ~]# y="$x+1"
    [root@oldboyedu ~]# echo $y
    1+1
    [root@oldboyedu ~]# y='$x+1'
    [root@oldboyedu ~]# echo $y
    $x+1
    [root@oldboyedu ~]# y=`$x+1`
    -bash: 1+1: command not found
    [root@oldboyedu ~]# let y="$x+1"  #<==让括号的内容进行计算。
    [root@oldboyedu ~]# echo $y
    2
    
    [root@oldboyedu ~]# a=1
    [root@oldboyedu ~]# echo ${a}b
    1b
    

    1.6 表达式

    [ 表达式 ]中括号表达式,中括号里面两端必须要有空格。

    字符串要加双引号

    [root@oldboyedu ~]# [ "a" = "b" ] && echo 1||echo 0
    0
    [ "a" = "b" ] && echo 1||echo 0
    如果表达式成立,打印1,否则打印0.
    
    [ "a" = "b" ] && echo 1  #跟屁虫。
    如果表达式成立,打印1
    [ "a" = "b" ] || echo 0  #杠精。
    如果表达式成立是假的,打印0
    取反:
    [ ! "a" = "b" ] && echo 1
    

    a. 整数表达式:

    表1: 整数表达式对应表

    类型 对应关系
    > -gt
    -ge
    < -lt
    -le
    = -eq
    -ne

    示例:

    [root@oldboyedu ~]# a=1
    [root@oldboyedu ~]# [ $a -eq 2 ] && echo 1||echo 0
    0
    [root@oldboyedu ~]# [ $a -eq 1 ] && echo 1 || echo 0
    1
    

    小结:

    • 1)整数表达式符 两端必须要有空格
    • 2)中括号里面两端必须要有空格。
    • 3)变量和比较的内容,不需要加引号。

    b. 字符表达式

    表2: 字符表达式对应表

    类型 对应关系
    -z 变量内容长度为0时,为真(表达式正确)。zero
    -n 变量内容长度不为0时,为真(表达式正确)。not zero

    注意:

    a == a 字符串是否相同,要用两个等于号

    说明:
    字符串要加双引号

    例子:

    [root@oldboyedu ~]# oldboy="I am oldboy"
    [root@oldboyedu ~]# [ -z "$oldboy" ] && echo 1 || echo 0
    0
    [root@oldboyedu ~]# oldboy=""
    [root@oldboyedu ~]# [ -z "$oldboy" ] && echo 1 || echo 0
    1
    [root@oldboyedu ~]# [ -n "$oldboy" ] && echo 1 || echo 0
    0
    [root@oldboyedu ~]# [ "test" == "host" ] && echo 1 || echo 0
    0
    [root@oldboyedu ~]# [ "test" == "test" ] && echo 1 || echo 0
    1
    

    1.7 if 判断句:

    if 判断句语法

    if [ 表达式 ]
    then
       命令
    fi
    

    示例

    [root@oldboyedu ~]# cat test.sh
    #!/bin/bash
    a=1
    if [ $a -gt 1 ]
    then
        echo 1
    else
        echo 0
    fi
    
    [root@oldboyedu ~]# cat test.sh 
    #!/bin/bash
    boy="潜力股"
    if [ "$boy" ==  "潜力股" ]
    then
        echo "先和你谈谈朋友"
    else
        echo "白白"
    fi
    [root@oldboyedu ~]# sh test.sh
    先和你谈谈朋友
    
    [root@oldboyedu ~]# cat judge_date.sh
    if [ $(date +%w) -eq 6 ]
    then 
        echo "一起去旅游吧"
    else
        echo "还是好好上课吧"
    fi
    [root@oldboyedu ~]# sh judge_date.sh
    还是好好上课吧
    [root@oldboyedu ~]# date
    Tue Apr  9 11:33:13 CST 2019
    [root@oldboyedu ~]# date -s '2019/4/13'
    Sat Apr 13 00:00:00 CST 2019
    [root@oldboyedu ~]# sh judge_date.sh
    一起去旅游吧
    

    实现多条件

    [root@oldboyedu ~]# cat judge_date.sh 
    if [ $(date +%w) -eq 6 ] || [ $(date +%w) -eq 0 ]
    then 
        echo "一起去旅游吧"
    else
        echo "还是好好上课吧"
    fi
    

    read命令: 交互式读取用户输入

    参数:

    • -p "提醒:"
    • -t "多长时间内等待输入"

    示例:

    [root@oldboyedu ~]# read  -p "请输入一句话:" boy
    请输入一句话:潜力股
    [root@oldboyedu ~]# echo $boy
    潜力股
    
    相当于boy="潜力股"
    
    [root@oldboyedu ~]# cat test.sh 
    #!/bin/bash
    read -p "请输入你喜欢的男孩的一句话:" boy
    if [ "$boy" ==  "潜力股" ]
    then
        echo "先和你谈谈朋友"
    else
        echo "白白"
    fi
    
    [root@oldboyedu ~]# sh test.sh
    请输入你喜欢的男孩的一句话:我没钱
    白白
    [root@oldboyedu ~]# sh test.sh
    请输入你喜欢的男孩的一句话:潜力股
    先和你谈谈朋友
    
    [root@oldboyedu ~]# cat test.sh 
    #!/bin/bash
    read -p "请输入你喜欢的男孩的一句话:" boy
    if [ "$boy" ==  "潜力股" ]
    then
        echo "先和你谈谈朋友"
    
    elif [ "$boy" ==  "老爸是李刚" ]
    then
       echo "直接嫁给你"
    
    elif [ "$boy" ==  "二环内有套房" ]
    then
       echo "立马领证"
    
    else
        echo "白白"
    fi
    

    练习题: Shell编程实现 两个整数比较大小

    [root@oldboyedu ~]# cat com_num.sh
    #!/bin/sh
    read -p "请输入两个整数:" a b
    if [ $a -gt $b ]
    then
        echo "$a>$b"
    elif [ $a -eq $b ]
    then
        echo "$a=$b"
    else
        echo "$a<$b"
    fi
    
    [root@oldboyedu ~]# sh com_num.sh
    请输入两个整数:2 3
    2<3
    [root@oldboyedu ~]# sh com_num.sh
    请输入两个整数:3 3
    3=3
    [root@oldboyedu ~]# sh com_num.sh
    请输入两个整数:3 4
    3<4
    [root@oldboyedu ~]# sh com_num.sh
    请输入两个整数:3 2
    3>2
    

    特殊位置变量:

    • 1 脚本文件的第一个参数赋值给1
    • 2 脚本文件的第二个参数赋值给2
    [root@oldboyedu ~]# cat t.sh
    echo $1 $2
    [root@oldboyedu ~]# sh t.sh oldboy oldgirl
    oldboy oldgirl  #<==oldboy就是$1输出的结果,oldgirl就是$2输出的结果。
    
    [root@oldboyedu ~]# cat com_num.sh 
    #!/bin/sh
    #read -p "请输入两个整数:" a b
    a=$1
    b=$2
    if [ $a -gt $b ]
    then
        echo "$a>$b"
    elif [ $a -eq $b ]
    then
        echo "$a=$b"
    else
        echo "$a<$b"
    fi
    
    [root@oldboyedu ~]# sh com_num.sh 2 3
    2<3
    [root@oldboyedu ~]# sh com_num.sh 2 2
    2=2
    [root@oldboyedu ~]# sh com_num.sh 3 2
    3>2
    

    1.8 for循环

    for循环语法

    for n in 取值列表
    do
       执行命令
    done
    

    示例:

    [root@oldboyedu ~]# cat for1.sh 
    for n in 1 2 3 4 5
    do
        echo $n
    done
    [root@oldboyedu ~]# sh for1.sh
    1
    2
    3
    4
    5
    

    查看执行过程,加参数 -x

    [root@oldboyedu ~]# sh -x for1.sh
    + for n in 1 2 3 4 5
    + echo 1
    1
    + for n in 1 2 3 4 5
    + echo 2
    2
    + for n in 1 2 3 4 5
    + echo 3
    3
    + for n in 1 2 3 4 5
    + echo 4
    4
    + for n in 1 2 3 4 5
    + echo 5
    5
    

    取值列表也可使用{}生成有序数列l,例如:

    [root@oldboyedu ~]# cat for1.sh
    for n in {1..5}
    do
        echo $n
    done
    [root@oldboyedu ~]# sh for1.sh
    1
    2
    3
    4
    5
    

    练习题: 打印254个IP:10.0.0.1-10.0.0.254

    [root@oldboyedu ~]# cat for1.sh
    for n in {1..254}
    do
        echo "10.0.0.$n"
    done
    

    1.8 课后练习题

    1、比较整数大小。

    答:

    [root@oldboyedu  /server/scripts]# cat 1.sh 
    #!/bin/bash
    read -p "请输入两个整数:" a b
    if [ $a -gt $b ]
    then
        echo "两个整数的结果:$a>$b"
    elif [ $a -eq $b  ]
    then
        echo "两个整数的结果:$a=$b"
    else 
        echo "两个整数的结果:$a<$b"
    fi
    

    2、判断日期,每周六日去旅游,其它时间上课。

    答:

    [root@oldboyedu  /server/scripts]# cat 2.sh 
    #!/bin/bash
    a=$(date +%w)
    if [ $a -eq 6 ] ||  [ $a -eq 0] 
    then
        echo "去旅游"
    else
        echo "去上课"
    fi
    

    3、取出当前系统Ip地址,判断是否为10.0.0.31,如果是提示正确,如果不是给出提示。

    答:

    [root@oldboyedu  /server/scripts]# cat 3.sh 
    #!/bin/bash
    a=$(ifconfig eth0|awk 'NR==2{print $2}')
    if [ $a == "10.0.0.31" ]
    then 
        echo "正确"
    else
        echo "不是本机IP,本机IP为$a"
    fi
    
    [root@oldboyedu  /server/scripts]# cat 3.sh 
    #!/bin/bash
    a=$(hostname -I)
    if [ $a == "10.0.0.31" ]
    then 
        echo "正确"
    else
        echo "不是本机IP,本机IP为$a"
    fi
    

    4、打印10.0.0.1--10.0.0.254个Ip地址,当IP地址为系统IP地址时,给出某IP是系统IP的提示。

    答:

    [root@oldboyedu  /server/scripts]# cat 4.sh 
    #!/bin/bash
    a=$(ifconfig eth0|awk 'NR==2{print $2}')
    for n in {1..254}
    do
      if [ 10.0.0.$n == $a ]
      then
        echo "10.0.0.$n 为系统IP地址"
      else
        echo "10.0.0.$n"
      fi
    done   
    

    提示: 书写脚本习惯:

    • 1.以.sh结尾。
    • 2.脚本开头第一行 #!/bin/bash 脚本内容由谁解释。
      由于Linux下默认是bash,所以也可以不写这一行。

    相关文章

      网友评论

          本文标题:作业-第07周--课堂-Day28-Shell与Shell编程相

          本文链接:https://www.haomeiwen.com/subject/netswqtx.html