美文网首页
shell编程(一)

shell编程(一)

作者: Freestyle_0f85 | 来源:发表于2019-10-16 15:53 被阅读0次

    1.shell的入门
    1)什么是shell 壳
    命令解释器 用户输入命令 解释器负责解释给内核 处理后的结果 反馈用户 称为解释
    交互式shell 用户输入命令 解释器解释把处理后的结果反馈给用户的过程称为 交互式
    非交互shell shell执行文本中的命令 当执行到文件的末尾 bash退出
    父shell 不能继承子shell变量 子shell可继承父shell变量
    2)什么是shell脚本
    把可执行命令堆积到一个文本中则称为shell脚本(条件表达式 for循环 if判断等等语句)

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

    hello world!
    执行脚本的三种方式   
    1)bash test.sh
    [root@web01 scripts]# bash test.sh
    Hello World!
    2)全路径执行
    [root@web01 scripts]# chmod +x test.sh 
    [root@web01 scripts]# /server/scripts/test.sh
    Hello World!
    3). 或者source执行
    [root@web01 scripts]# . test.sh
    Hello World!
    [root@web01 scripts]# source test.sh
    Hello World! 
    

    4.几种方式的区别?
    前两种方式都是在子shell中执行
    . source 是在父进程中执行

    5.环境变量
    1)什么是环境变量?
    右边一堆内容,用一个名字来代替称为环境变量
    环境的相关文件

    1. /etc/profile 开机或者新连接的窗口执行一次
    2. .bashrc
    3. .bash_profile
    4. /etc/bashrc
      2)如何定义环境变量
      变量名=变量值
      不加export,只对当前shell生效
      加export,对当前窗口下所有shell生效
    [root@web01 scripts]# name=oldboy
    [root@web01 scripts]# echo "$oldboyisok"
    [root@web01 scripts]# echo "${oldboy}isok"
    isok
    [root@web01 scripts]# echo "${name}isok"
    oldboyisok
    [root@web01 scripts]# echo '${name}isok'
    ${name}isok
    

    6.重要的特殊位置的变量

    $0脚本的名称,如果全路径执行脚本,则脚本名称也带全路径 basename 获取脚本的名称 重要
    案例: 给用户提示如何使用此脚本
    echo $"Usage: $0 {start|stop|status|restart|force-reload}"
    $n  脚本的第n个参数 $0被脚本名称占用 从$1开始 $9以后 需要加{}
    $#  代表了脚本的传参的总个数  重要
    案例:
    [ $# -ne 2 ] && echo "你请输入两个参数" && exit
    $*  脚本的所有的传参的参数 如果不加双引号则和$@相同 加上双引号则把所有参数视为一个整体
    $@ 脚本的所有的传参的参数 如果不加双引号则和$*相同加上双引号则把所有参数视为独立的参数
    $* 和$@ 正常情况下一样  循环体内不同
    $?  获取上一条命令的结果 0为成功 非0 失败  重要   
    $$  获取脚本的PID
    案例
    服务器运行大量的名称相同的脚本
    echo $$ > /tmp/count.pid
    $!  上一个在后台运行脚本的PID 调试使用
    $_   获取脚本的最后一个参数 相当于ESC .
    

    7.传参的三种方式
    1)直接传参
    2)赋值传参
    3)read传参

    #第一种传参方式
    echo $1 $2
    #第二种传参方式
    name=$1
    age=$2
    echo $name $age
    read -p "请输入名字和年龄" name1 age1
    echo $name1 $age1
    案例:
    使用read 传参的方式 更改系统的主机名称和IP地址的最后一位 192.168.12.X
    #!/bin/sh
    sdir="/etc/sysconfig/network-scripts/ifcfg-eth0"
    sip=`cat /etc/sysconfig/network-scripts/ifcfg-eth0|awk -F. '/IPADDR/{print $NF}'|cut -c1`
    read -p "请输入主机名称: " name
    hostnamectl set-hostname $name
    read -p "请输入IP地址的最后一位: " ip
    sed -i "s#$sip#$ip#g"  $sdir
    这个脚本使用的时候是替换取出来的值,还是有可能会报错
    #!/bin/bash
    #author weixu
    cd /etc/sysconfig/network-scripts/
    hostnamectl set-hostname $1
    [ $? -eq 0 ] && echo "success"|| echo "fail"
    sed -ri "/^IPA/s#(.*\.).*#\1$2#g" ifcfg-eth[01]
    [ $? -eq 0 ] && echo "success"|| echo "fail"
    cd
    
    案例:
    sh ping.sh www.baidu.com
    ping www.baidu.com is ok
    sh ping.sh www.xxxxx.com is error
    [root@web01 scripts]# cat ping.sh 
    #!/bin/sh
    read -p "请输入一个网址: " url
    ping -c 1 -W 1 $url >/dev/null 2>&1
    [ $? -eq 0 ] && echo "ping $url is ok" || echo "ping $url is error"
    

    8.变量的字串知识

    变量的切片
    [root@web01 scripts]# echo ${name:0:1}
    I
    [root@web01 scripts]# echo ${name:1}
    am lizhenya
    取字符串长度
    方法1
    echo I am lizhenya teacher I am 18|wc -L
    方法2
    name="I am lizhenya teacher I am 18"
    echo ${#name}
    方法3
    [root@web01 scripts]# expr length "$name"
    29
    方法4
    [root@web01 scripts]# echo $name|awk '{print length}'
    29
        
    面试题:取字符串长度小于3的
    方法1 
    for循环方式
    [root@web01 scripts]# cat for.sh 
    #!/bin/sh
        for i in I am lizhenya teacher I am 18
                do
            [ ${#i} -lt 3 ] && echo $i
        done
    方法2
    [root@web01 scripts]# echo I am lizhenya teacher I am 18|xargs -n1|awk '{if(length<3)print}'
    I
    am
    I
    am
    18
    方法3
    [root@web01 scripts]# echo I am lizhenya teacher I am 18|awk '{for(i=1;i<=NF;i++)if(length($i)<3)print $i}'
    

    9.变量的删除和替换

    从前往后删除变量内容
    [root@web01 scripts]# echo $url
    www.sina.com.cn
    [root@web01 scripts]# echo ${url#*.}
    sina.com.cn
    [root@web01 scripts]# echo ${url#*.*.}
    com.cn
    [root@web01 scripts]# echo ${url##*.}
    cn
    一个#删除的最短的那个,两个#是删除最长的那个
    从后往前删除变量内容
    [root@web01 scripts]# echo $url
    www.sina.com.cn
    [root@web01 scripts]# echo ${url%.*}
    www.sina.com
    [root@web01 scripts]# echo ${url%%.*}
    www
    一个%删除的最短的那个,两个%删除最长的按个
    变量的替换
    [root@web01 scripts]# echo $url
    www.sina.com.cn
    [root@web01 scripts]# echo ${url/w/a}
    aww.sina.com.cn
    [root@web01 scripts]# echo ${url/w/aa}
    aaww.sina.com.cn
    [root@web01 scripts]# echo ${url//w/a}
    aaa.sina.com.cn
    [root@web01 scripts]# echo ${url/sina/baidu}
    www.baidu.com.cn
    一个/是替换匹配到的第一个,两个//是替换所有
    

    10.数值的运算

    expr $(()) $[] 整数运算 第二种效率最高
    [root@web01 scripts]# expr 1+1
    1+1
    [root@web01 scripts]# expr oldboy
    oldboy
    [root@web01 scripts]# echo $((10+10))
    20
    [root@web01 scripts]# echo $[10+10]
    20
    
    let  重点 
    [root@web01 scripts]# let sum=10+10
    [root@web01 scripts]# echo $sum
    20
    i++   变量自增
    [root@web01 scripts]# let i=i+1
    [root@web01 scripts]# echo $i
    1
    [root@web01 scripts]# let i++
    [root@web01 scripts]# echo $i
    2
    
    bc awk python 可以计算小数.
    [root@web01 scripts]# echo 10+10.5|bc
    20.5
    [root@web01 scripts]# awk 'BEGIN{print 10*10.5}'
    105
    [root@web01 scripts]# awk 'BEGIN{print 10^10}'
    10000000000
    

    案例
    加减乘除的计算器

    [root@web01 scripts]# cat count.sh 
    #!/bin/sh
    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]"
    

    11.条件表达式
    []======test []常用
    [ -f file ] 文件是否存在 且为普通文件 重点
    [ -e file ] 文件存在则为真
    [ -d file ] 目录存在则为真 重点
    [ -x file ] 文件有执行权限则为真
    [ -w file ] 文件可写则为真
    [ -r file ] 文件可读则为真
    案例

    [root@web01 scripts]# [ -f /etc/init.d/functions ] && . /etc/init.d/functions
    [root@web01 scripts]# action "hehehe is"  /bin/true
    hehehe is                                                  [  确定  ]
    [root@web01 scripts]# action "hehehe is"  /bin/false
    hehehe is                                                  [失败]
    函数库使用
    [root@web01 scripts]# cat ping.sh 
    #!/bin/sh
    [ -f /etc/init.d/functions ] && . /etc/init.d/functions
    read -p "请输入一个网址: " url
    ping -c 1 -W 1 $url >/dev/null 2>&1
    [ $? -eq 0 ] && action "ping $url is" /bin/true || action "ping $url is" /bin/false
    

    12.数值的比较
    [ 数值1 比较符 数值2 ] [[]] = != >= < <=
    -eq 相等
    -ne 不等于
    -gt 大于
    -ge 大于等于
    -lt 小于
    -le 小于等于
    案例1
    统计当前磁盘的使用率 如果大于5% 则把内容写入到以日期为名称的文本中 2019-08-01.txt
    如果小了 则把当前的使用率 写入 2019-08-01.txt
    1.如何取出当前的使用率
    2.条件表达式 整数的比较
    3.输出结果到文本
    4.调试

    [root@shell scripts]# cat usedisk.sh 
    #!/bin/sh
    time=`date +%F`
    usedisk=`df -h|grep /$|awk '{print $(NF-1)}'`
    [ ${usedisk%\%} -gt 5 ] && echo "当前使用率不正常 $usedisk" >> ${time}.txt || echo "当前使用率正常 $usedisk" >> ${time}.txt 
    

    案例2
    统计系统内存的使用率 如果大于10则 echo 使用率到 以时间命名的文件中
    1.如何取出当前的使用率
    百分比=====使用的除总数乘100
    2.条件表达式 整数的比较
    3.输出结果到文本
    4.调试

    [root@web01 scripts]# free|awk 'NR==2{print $3/$2*100}'
    19.0124
    [root@web01 scripts]# free=`free|awk 'NR==2{print $3/$2*100}'`
    [root@web01 scripts]# [ ${free%.*} -gt 10 ] && echo error || echo ok
    error
    [root@web01 scripts]# [ ${free%.*} -gt 80 ] && echo error || echo ok
    ok
    

    相关文章

      网友评论

          本文标题:shell编程(一)

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