美文网首页
shell编程

shell编程

作者: linux_龍 | 来源:发表于2019-10-03 15:01 被阅读0次

    1.什么是shell编程

    shell命令解释器

    • bach
    • dash 用于Ubuntu系统
    • csh tcsh 用于unix系统


      image.png

    2.开发语言中程序代码的分类

    • 编译型:开发书写的代码 无法直接运行 需要编译 (代码 - 命令)c语言
    • 解释型:书写完成代码 通过命令执行(shell脚本)shell 书写脚本 然后可以直接运行

    3.执行脚本

    (1)方法一:
    直接运行脚本加上x权限

    [root@m01 /server/scripts]# vim touch.sh
    [root@m01 /server/scripts]# ll touch.sh 
    -rw-r--r-- 1 root root 52 Sep  5 17:45 touch.sh
    [root@m01 /server/scripts]# chmod +x touch.sh 
    [root@m01 /server/scripts]# . /server/scripts/touch.sh
    [root@m01 ~]# tree /oldboy
    /oldboy
    └── oldboy01
    
    0 directories, 1 file
    

    (2)方法er:
    sh 执行

    [root@m01 ~]# sh /server/scripts/touch.sh
    [root@m01 ~]# tree /oldboy
    /oldboy
    └── oldboy01
    
    0 directories, 1 file
    

    (3)方法三:
    source 或 . 替你在当前环境中执行一次脚本

    [root@m01 /server/scripts]# . touch.sh
    [root@m01 /server/scripts]# tree /oldboy
    /oldboy
    └── oldboy01
    
    0 directories, 1 file
    
    [root@m01 /server/scripts]# source touch.sh 
    [root@m01 /server/scripts]# tree /oldboy
    /oldboy
    └── oldboy01
    
    0 directories, 1 file
    
    image.png

    (4)方法4
    输入重定向方法

    [root@m01 /server/scripts]# sh <touch.sh 
    [root@m01 /server/scripts]# tree /oldboy
    /oldboy
    └── oldboy01
    
    0 directories, 1 file
    

    4.shell编程基础知识

    • 书写脚本 加上第一行命令解释器
    • 版权说明
    • 不要加中文
    • 成对符号提前敲好
    • """" `` '' {} [] ()
    • 脚本文件名:尽量不要包含服务名称 看见文件名 知道脚本作用

    5.shell中的变量

    举例 x+y=20 已知x=30 y=? 未知数
    变量

    • 用一个固定的字符串,替代更多更复杂的内容
    • 存放在脚本中经常用到的内容 ip 时间
    • 变量的本质是内存中的区域 变量名称区域的地址
      wangk 变量名称 相当于武功秘籍
      echo $wangk 相当于看武功秘籍
      wangk=“动作 成功” 修改变量内容

    6.变量的命名规则:

    • 不能以数字开头
    • 变量表示作用: name=oldboy age=18 input_name

    7.sh与source (.)区别

    [root@m01 /server/scripts]# cat shon.sh
    #!/bin/bach
    
    echo $OLDBOY
    [root@m01 /server/scripts]# OLDBOY=666
    
    [root@m01 /server/scripts]# sh shon.sh
    
    [root@m01 /server/scripts]# source shon.sh
    666
    
    • sh 执行脚本生成子 shell 而这个变量在子shell中没有定义
    • source include 把这个脚本仔当前shell环境中运行

    8.应用场景:

    • sh日常执行脚本
    • source 一般用来 实现include功能 或配置环境变量 别名后生效
    调用系统命令测试shell
    . /etc/init.d/functions
    [root@m01 /server/scripts]# . /etc/init.d/functions
    [root@m01 /server/scripts]# action '服务OK' /bin/true
    服务OK                                                     [  OK  ]
    [root@m01 /server/scripts]# action '服务挂了' /bin/talse
    服务挂了 -bash: /bin/talse: No such file or directory
                                                               [FAILED]
    

    9.变量

    • 变量本质 内存中的一块区域 变量名 位置
    • 存放经常用到的内容
    • linux下面的变量直接使用即可
    • 数据类型 (变量在内存中 所占多少空间 变量类型) 不同类型的变量存放不同类型的数据
      变量赋值
    [root@m01 ~]# oldboy='oldboy 666'
    [root@m01 ~]# echo $oldboy
    oldboy 666
    

    变量中的符号

    单引号 所见即所得 原封不动的输出
    双引号 与单引号类似 对特殊符号进行解析(() `` !)
    无引号 与双引号类似 支持通配符 ({} * *.)
    反引号 优先执行 优先执行里面的命令

    10.变量分类

    • 环境变量(全局变量)
    • 普通变量 (局部变量)
    • 特殊变量

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

    • 系统定义
    • 大写字母
    • 在系统中 各个地方基本都是用
    env
    env命令时gnu的coreutils包内的一个软件,它的功能是:在一个修改后的环境里执行命令。
    
    declare
    declare为shell指令,在第一种语法中可用来声明变量并设置变量的属性([rix]即为变量的属性),在第二种语法中可用来显示shell函数。若不加上任何参数,则会显示全部的shell变量与函数(与执行set指令的效果相同)。
    
    export 
    Linux export命令用于设置或显示环境变量。
    在shell中执行程序时,shell会提供一组环境变量。export可新增,修改或删除环境变量,供后续执行的程序使用。export的效力仅及于该次登陆操作。
    
    image.png
    • env set declare
    • unset 取消变量
    • export 创建或这只环境变量

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

    • 命名规则
    • 不能以数字开通
    • 不要占用系统的环境变量
    [root@m01 ~]# day=7
    [root@m01 ~]# echo $day
    7
    [root@m01 ~]# echo $dayday
    
    [root@m01 ~]# echo ${day}day
    7day
    

    11.与变量相关的文件

    • 每次登陆系统 每次切换用户
    image.png
    • ./etc/profile
    • /etc/bashrc
    • ~/.bashrc
    • ~/.bash_profile
    • /etc/profile.d/*.sh
      目录每次用户登录系统 都会运行目录下面.sh脚本结尾

    12.特殊变量

    • 提高书写脚本 及脚本执行效率
    • 判断服务状态

    13.特殊重要变量位置

    image.png

    1.$0

    • 一般用来 在脚本执行错误的时候(参数写错 不对) 给用户进行提示
      Usage: $0
    [root@m01 /server/scripts]# cat shos.sh
    #!/bin/bash
    echo $0
    [root@m01 /server/scripts]# sh shos.sh
    shos.sh
    [root@m01 /server/scripts]# sh /server/scripts/shos.sh 
    /server/scripts/shos.sh
    

    2.$n 数字

    • 脚本的
    • 命令行中的内容 传递到脚本中
    • /etc/init.d/network restart
    [root@m01 /server/scripts]# cat shoy.sh 
    #!/bin/bash
    echo "Usage: $0 {start|stop|restart}"
    echo "$1 $2 $3"
    [root@m01 /server/scripts]# sh shoy.sh a b c
    Usage: shoy.sh {start|stop|restart}
    a b c
    

    故障预警:
    n n超过9 从10开始 需要使用{10}

    3.$#

    • 脚本参数的个数
    • 应用场景: 参数个数等于0 则显示错误提示
    [root@m01 /server/scripts]# cat shoq.sh  
    #!/bin/bash
    if [ $# -eq 0 ];then 
    echo "Usage: $0  {start|stop|restart}" 
    fi
    
    
    [root@m01 /server/scripts]# sh shoq.sh 
    Usage: shoq.sh  {start|stop|restart}
    

    4.*@

    • $* 取出所有参数 双引号: 1个参数一个整体
    • $@ 取出所有的参数:双引号:每个参数独立

    14.特殊位置变量

    image.png

    15.特殊变量 状态

    ? 上一条命令的执行的结果 为0正确 非0失败 $$ 当前运行脚本的pid! 上一个运行脚本的pid
    $_ 上一个ming6ling或脚本的最后一个参数esc+.

    1.$?

    • 检查命令pid

    2.$$

    • 用于记录脚本的pid 号码
    • 方便进行kill 或查询状态
    • tee 配合管道 信息输出到屏幕 信息写入到文件
    • sh pang.sh & 让脚本后台运行
    • 脚本中记录脚本的pid号码 写入到文件中
    • 后面可以方便查看或根据pid结束进程

    16.变量子串

    • parameter 变量名字(参数)
    • 使用时候 遇到 含义 去哪里查找
    • man bash 参考 parameter Expansion(参数展开)
      image.png
      image.png
      基础用法
    • ${变量}
    • ${#变量} 统计变量中内容的字数(字符数)
    [root@m01 ~]# oldboy=xiaolv
    [root@m01 ~]# echo $oldboy
    xiaolv
    [root@m01 ~]# echo ${oldboy}
    xiaolv
    [root@m01 ~]# echo ${#oldboy}
    6
    [root@m01 ~]# 
    

    1. 统计字符数方法

    [root@m01 ~]# echo ${oldboy}
    xiaolv
    [root@m01 ~]# echo ${oldboy} |wc -L
    6
    [root@m01 ~]# echo ${oldboy} |awk '{print length()}'
    6
    

    面试题: I am oldboy linux,welcome to our training. 显示这串字符中 单 词字符数大于6的单词
    方法一

    [root@m01 /server/scripts]# cat stat.sh
    #!/bin/bash
    stat='I am oldboy linux,welcome to our training' 
    for n in $stat
    do
     if [ ${#n} -gt 6 ];then
        echo $n
    fi
    done
    
    [root@m01 /server/scripts]# sh stat.sh
    linux,welcome
    training
    

    2.按照范围cut

    • ${变量:起点}
    • ${变量:起点:长度}
    [root@m01 /server/scripts]# test='I am oldboy teacher'
    [root@m01 /server/scripts]# echo $test |cut -c1-4
    I am
    [root@m01 /server/scripts]# echo ${test:4}
    oldboy teacher
    [root@m01 /server/scripts]# echo ${test:2}
    am oldboy teacher
    [root@m01 /server/scripts]# echo ${test:2:4}
    am o
    [root@m01 /server/scripts]# echo ${test:4:6}
    oldbo
    
    

    3.删除

    [root@m01 /server/scripts]#  test='I am oldboy teacher' 
    [root@m01 /server/scripts]#  echo "${test#o}" 
    I am oldboy teacher
    [root@m01 /server/scripts]#  echo "${test#I}" 
     am oldboy teacher
    [root@m01 /server/scripts]#  echo "${test#*o}" 
    ldboy teacher
    [root@m01 /server/scripts]#  echo "${test##*o}" 
    y teacher     
    #相当于正则^
    
    [root@m01 /server/scripts]#  test='I am oldboy teacher' 
    [root@m01 /server/scripts]#  echo "${test%o*}" 
    I am oldb
    [root@m01 /server/scripts]#  echo "${test%%o*}" 
    I am 
    %百分号从末尾开始删除
    

    4.替换(sed)

    [root@m01 /server/scripts]#  test='I am oldboy teacher' 
    [root@m01 /server/scripts]# echo ${test/oldboy/oldgirl/}
    I am oldgirl/ teacher
    [root@m01 /server/scripts]# echo ${test/o/}
    I am ldboy teacher
    [root@m01 /server/scripts]# echo ${test//o/}
    I am ldby teacher
    [root@m01 /server/scripts]# echo ${test//[a-z]/}
    
    [root@m01 /server/scripts]# echo ${test//[a-z]/666}
    666 666666 666666666666666666 666666666666666666666
    

    17.变量扩展

    内容
    含义
    ${parameter:-word}
    如果parameter没有被赋值或者其值为空,那么
    就以word作为其值。
    如果parameter没有被赋值或者其值为空,那么
    ${parameter:=word}
    就以word作为其值,且将word赋值给
    parameter。
    如果parameter没有被赋值或者其值为空,那么
    ${parameter:?word}
    就把word作为错误输出否则显示parameter内
    容
    如果parameter没有被赋值或者其值为空,就什
    ${parameter:+word}
    么都不做否则用word替换变量内容
    

    1.${parameter:-word}

    如果parameter没有被赋值或者其值为空,那么就以word作为其值 给变量设置默认值(初始值) 删除操作的时候 设置1个默认的目

    [root@m01 /server/scripts]# test='I am oldboy teacher'
    [root@m01 /server/scripts]# echo ${test:-var not define}
    I am oldboy teacher
    [root@m01 /server/scripts]# unset test
    [root@m01 /server/scripts]# echo $test
    
    [root@m01 /server/scripts]# echo ${test:-var not define}
    var not define
    

    2.${parameter:=word

    [root@m01 /server/scripts]# test='I am oldboy teacher'
    [root@m01 /server/scripts]# echo ${test:=I am linux teacher}
    I am linux teacher
    [root@m01 /server/scripts]# unset test
    [root@m01 /server/scripts]# echo ${test:=I am linux define}
    I am linux define
    [root@m01 /server/scripts]# echo $test
    I am linux define
    

    3.${parameter:?word}

    [root@m01 /server/scripts]# echo ${test:=?I am linux define}
    I am linux define
    [root@m01 /server/scripts]# echo $?
    0
    [root@m01 /server/scripts]# unset test
    [root@m01 /server/scripts]# echp ${test:?I am linux teacher}
    -bash: test: I am linux teacher
    [root@m01 /server/scripts]# echo $?
    1
    

    4. ${parameter:+word}

    [root@m01 /server/scripts]# echo $test
    
    [root@m01 /server/scripts]# echo ${test:+oldboyedu}
    
    [root@m01 /server/scripts]# test=xiaolv
    [root@m01 /server/scripts]# echo ${test:+oldboyedu}
    oldboyedu
    [root@m01 /server/scripts]# echo $test
    xiaolv
    

    18.运算

    - 运算符
    + -  * 、 %(取余)
    &&
    ||
    +=
    a+=1 <->a=a+1
    8/4 =2 余0
    7/4 =1 余3
    
    image.png
    • 运算方法

    方法1. (())

    [root@m01 /server/scripts]# a=1
    [root@m01 /server/scripts]# b=2
    [root@m01 /server/scripts]# echo $a+$b
    1+2
    [root@m01 /server/scripts]# ((c=a+b))
    [root@m01 /server/scripts]# echo $c
    3
    

    方法2.let

    [root@m01 /server/scripts]# let c=a+b
    [root@m01 /server/scripts]# let c=a+b+b+b
    [root@m01 /server/scripts]# echo $c
    7
    

    方法3.expr

    * 乘号有特殊含义
    [root@m01 /server/scripts]# expr 1 + 2
    3
    [root@m01 /server/scripts]# expr 2 * 3
    expr: syntax error
    [root@m01 /server/scripts]# expr 2 \* 3
    6
    判断参数是否为数字
    

    方法4.bc

    [root@m01 /server/scripts]# echo 10/3 |bc -l
    3.33333333333333333333
    

    方法5.$[]

    不能计算小数点
    [root@m01 /server/scripts]# echo $[1/3]
    0
    [root@m01 /server/scripts]# echo $[10**3]
    1000
    

    方法6.awk

    [root@m01 /server/scripts]# awk 'BEGIN{print 1/3}'
    0.333333
    

    linux下面的计算方法统计:

    种类 方法
    awk 'BEGIN{}
    echo + bc -l
    $(())
    let
    expr
    $[]·

    1.书写简单计算器

    • 从命令行输入 2个参数 sh cal.sh 10 20

    • 计算他们的+ - * / 显示出来

    • 基础提高:参数个数不对 提示使用帮助并退出脚本

    • lnb提高:

    • 必须输入的是数字

    • 基础功能+判断 参数个数

    [root@m01 /server/scripts]# cat cal-v1.sh
    #!/bin/bash
    num1=$1
    num2=$2
    echo "$1 + $2" |bc -l
    echo "$1 * $2" |bc -l
    echo "$1 - $2" |bc -l
    echo "$1 / $2" |bc -l
    
    [root@m01 /server/scripts]# sh cal-v1.sh 10 20
    30
    200
    -10
    .50000000000000000000
    
    • 基础功能+参数个数+参数是否为数字
    第一种方法:
    [root@m01 /server/scripts]# cat cal-v1.sh
    #!/bin/bash
    num1=$1
    num2=$2
    if [ $# -ne 2 ]
    then
     echo "Usage:$0 num1 num2"
     exit 1
    fi
    expr $num1 + $num2 + 666 &>/dev/null
    if [ $? -ne 0 ]
    echo "Usage: $0 num1 num2"   
    exit 2 
    fi 
    echo "$1 + $2" |bc -l
    echo "$1 * $2" |bc -l
    echo "$1 - $2" |bc -l
    echo "$1 / $2" |bc -l
    
    使用:
    [root@m01 /server/scripts]# sh cal-v1.sh 1 2
    3
    2
    -1
    .50000000000000000000
    
    第二种方法:
    #!/bin/bash
    read -p "请输入2个参数" num1 num2
    
    expr $num1 + $num2 + 666 &>/dev/null
    if [ $? -ne 0 ]
    then
        echo "Usage: $0 num1 num2" ? 
    exit 2
    fi
    echo "$num1 + $num2" |bc -l
    echo "$num1 * $num2" |bc -l
    echo "$num1 - $num2" |bc -l
    echo "$num1 / $num2" |bc -l
    
    使用
    [root@m01 /server/scripts]# sh cal-v1.sh
    请输入2个参数1 2
    3
    2
    -1
    .50000000000000000000
    

    计算器书写注意方式

    • 从命令行输入两个参数 sh +脚本名称 10 20
    • 参数个数不对 提示使用帮助 并退出脚本
    • 必须输入的是数字
    • 计算他们的+-*/ 显示出来

    **项目分析:(拆解)1 2 3

    • 输入两个参数
    • 判断参数个数
    • 判断这些参数是否为数字
    • 进行计算
    image.png

    19.条件测试语

    • 以后用于各种判断中的条件
    • 文件相关表达式
    • 字符串对比
      格式
      test <条件>
      [<条件>] 一般情通用
      [[<条件>]] [] 升级版 支持正则表达式
      ((<条件>))

    1.文件

    • 与文件相关的判断 /条件
    名称 含义
    -d directory 目录是否存在
    -f file 文件是否存在
    -e exist 是否存在
    -r read 文件是否存在 并且 是否有r权限
    -w write 文件是否存在 并且 是否有w权限
    -x execute 文件时候存在 并且 是否有x权限
    -s size 文件是否存在 并且 是否为空 大于0成立
    -L Symlink (symbolic link) 判断文件是否存在 是否为软连接
    /etc/hosts 文件存在 输出1 不存在输出0
    [root@m01 ~]# test -f /etc/hosts && echo 1 || echo 0
    1
    
    /etc/ho 文件存在 输出1 不存在输出0
    [root@m01 ~]# test -f /etc/hos && echo 1 || echo 0
    0
    
    /etc/ho 目录存在 输出1 不存在输出0
    [root@m01 ~]# test -d /etc/hos && echo 1 || echo 0
    0
    
    文件是否存在并且拥有x权限输出1 否则输出0
    [root@m01 ~]# test -x /etc/rc.local && echo 1 || echo 0
    0
    
    文件是否存在并且拥有x权限输出1 否则输出0
    [root@m01 ~]# [ -x /etc/rc.d/rc.local ] && echo 1 || echo 0
    0
    

    系统脚本判断案列:

    如果不是文件 退出并输出6 
    #!/bin/bash
    
    if [ ! -f /etc/sysconfig/network ];then
       exit 6
    fi
    
    [root@m01 /server/scripts]# sh then.sh
    [root@m01 /server/scripts]# echo $?
    0
    

    ** 常用的格式**

    满足条件 执行某个命令
    [ 条件 ] && 命令
    
    满足条件 执行多条命令
    [ 条件 ] && {
    cmd1
    cmd2
    }
    [ 条件 ] || 命令
    [ 条件 ] || {
    cmd1
    cmd2
    }
    

    20.字符串

    表达式 含义
    -n not zero 如果变量/字符串不是空的
    -z zero 如果变量/字符串是空
    "串1 "= 判断两个字符串/变量内容 是否一致 如果相等 则 成立
    "串2 " true 温馨提示加上双引号
    "串1"! = 判断两个字符串 /变量内容 是否一致 如果不相等 则成立
    "串2" true
    没有定义变量  为空 输出1
    [root@m01 /server/scripts]# [ -z "$oldboy" ] && echo 1 || echo 0
    1
    
    定义了变量 不为空 输出0
    [root@m01 /server/scripts]# oldboy=1
    [root@m01 /server/scripts]# [ -z "$oldboy" ] && echo 1 || echo 0
    0
    
    为18输出1 不为输出0
    [root@m01 /server/scripts]# oldboy=28
    [root@m01 /server/scripts]# [ "x$oldboy" = "x18" ] && echo 1 || echo 0
    0
    

    字符串比较注意事项

    • 字符串比较必须加引号
    • 使用!=或=使用空格
    • !=或=比较字符串是否相同

    相关文章

      网友评论

          本文标题:shell编程

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