设为首页 收藏本站
查看: 1202|回复: 0

shell脚本编程基础(1)及RAID阵列

[复制链接]

尚未签到

发表于 2018-8-28 09:42:36 | 显示全部楼层 |阅读模式
  shell脚本:
  Linux从底层到上层的系统架构:硬件-->内核-->库(lib)-->shell-->用户。
  shell既是一种命令语言,也是程序设计语言(shell脚本),作为一种命令语言,它提供了用户与内核的交互界面,互动式的解释和执行用户所输入的命令;作为程序设计语言,它又定义了各种变量和参数,并且提供了许多在高级语言中才具有的控制结构,比如循环和分支。
  写shell脚本的一般规范:
  # Name:init_app_jboss.sh   //脚本的名称
  # Version Number:1.00      //脚本修改后的版本
  # Type:config middleware for initing server  //脚本的功能
  # Language:bash shell        //脚本shell语言
  # Date:2013-06-19             //编写时间
  # Author:magedu              //脚本作者
  # Email:magedu@gmail.com  //作者邮件
  注意:#开头的行会被解释器忽略,空白行也会被解释器忽略
  shell脚本当中的变量:
  本地变量:作用域为当前的shell进程,包含环境变量
  变量的赋值:name=value    比如:a=1; a=$(cat /etc/passwd |wc -l)
  变量的引用:$name                     $a
  变量的查看:set
  变量的撤销:uset name   注意:此次不是引用变量,所有不需要加$
  环境变量:作用域为当前的shell进程及派生出来的子进程
  变量的赋值: declare -x name=[value]  或  export name=[value]
  变量的查看:env,export,declare -x,printenv
  局部变量:普通的变量,只在创建它的shell脚本中有效。
  位置参数变量: 表示向脚本传递参数
  [root@localhost tmp]# bash sum.sh $1 $2 $3
  $1 $2 $3就是脚本要用到的参数变量
  特殊变量:向脚本传递参数
  $0:  脚本文件路径自身
  $@: 取出给定脚本参数的路径  全部一起取并显示
  $#:  表示脚本参数的个数
  $*:   取出给定脚本参数的路径 单个单个取并显示
  $?:  查看上次执行后所返回的状态码
  比如:  [ $# -eq 2 ] && echo "yes,you are right" || echo "pleses give me two digital" 表示传递两个参数给脚本,如果是2个就输出yes,you are right,如果不是就输出please give me two digital。
  shell脚本当中的算术运算:
  +、-、*、/、%
  注意:shell变量是一种很“弱”的变量,默认情况下,一个变量保存一个串,shell不关心这个串是什么,所以要进行一些算术运算时,需要要用到一些命令如 let、declare、expr、双括号等。
  语法:
  let var=$sum1+$sum2
  var=$[$sum1+$sum2]
  var=$(($sum1+$sum2))
  var=$(expr $sum1 + $sum2)
  注意:*、/、%在有些情况下需要转义\,比如在var=$(expr $sum1 \* $sum2)
  变量的自曾自减:
  变量做某种运算后回存到此变量中;
  比如:let i=$i +#        #表示数字
  let i+=#
            [root@localhost ~]# i=1  
            [root@localhost ~]# let i=$i+2
  
            [root@localhost ~]# echo $i
  
             3
  变量的自增:
  var=$[$var+1]
  let  var+=1
  let  var++
              [root@localhost ~]# i=2  
              [root@localhost ~]# let i+=1
  
              [root@localhost ~]# echo $i
  
               3
  变量的自减:
  var=$[$var-1]
  let  var-=1
  let  var--
              [root@localhost ~]# i=2  
              [root@localhost ~]# let i--
  
              [root@localhost ~]# echo $i
  
               1
  shell脚本之条件测试:
  判断某需求是否满足,需要用到测试机制来实现:
  1、通过命令执行后返回的状态码来判断
  echo  $?       0:表示正常      1-255:表示失败
               [root@localhost ~]# sum=$[$sum1+$sum2]  
               [root@localhost ~]# echo $?
  
                0
  2、通过测试表达式:
  test  expression 或[expression] 或`expression`
  注意:EXPRESSION两端必须有空白字符,否则为语法错误;
  2.1 数值测试
  -eq:是否等于
  -ne:是否不等于
  -gt:是否大于
  -lt:是否小于
  -le:是否小于等于
  示例:比较用户centos和ubuntu哪个的uid更大.
             [root@localhost ~]# bash  sum1.sh  
              MAX is 1004
  

  
              #!/bin/bash
  
              #
  
              a=$(id -u centos)
  
              b=$(id -u ubuntu)
  
              [ $a -gt $b ] && echo "MAX is $a" ||echo "MAX is $b"
  2.2 字符串的比较
  ==:是否等于
  建议变量比较的时候加上 “”  [ ubuntu == "$u" ]
  >:是否大于
  /dev/null || echo "Unknow"
  
               sum=$(cat $1 |grep '^$' |wc -l)
  
               sum1=$(cat $2 |grep '^$' |wc -l)
  
               echo $sum
  
               echo $sum1
  
       结果:  [root@magedu md0]# bash sum.sh /etc/issue /etc/fstab
  
                1
  
                1
  示例:通过参数传递一个用户名给脚本,此用户名如果不存在则添加,参数 不为1,则报错.
        脚本:  #!/bin/bash  
                #
  
                [ $# -eq 1 ] && echo "" >/dev/null || echo "Unknow"
  
                if [ $ ]
  
        结果:  [root@magedu md0]# bash sum.sh centos
  
                 centos is exist
  
                [root@magedu md0]# bash sum.sh centos1
  
                [root@magedu md0]# vim sum.sh
  3、条件判断(选择分支)
  shell脚本的执行是顺序执行的,所以脚本无非就是语法加命令的堆积。
  选择分支
  单分支的if语句:
  if 测试条件;
  then
  代码分支
  fi
  双分支的if语句
  if 测试条件;then
  条件为真的时候执行的分支
  else
  条件为假的时候执行的分支
  fi
  多分支的if语句
  if 测试条件;then
  条件为真的时候执行的分支
  elif 测试条件;then
  elif 测试条件;then
  else
  条件为假的时候执行的分支
  fi
  示例:通过命令参数,给定两个数字,输出其中交大的数值 ,如果参数不为2,则报错
        脚本:  #!/bin/bash  
                #
  
                [ $# -eq 2 ] && echo "" >/dev/null || echo "Unknow" && exit 1
  
                if [ $1 -eq $2 ];then
  
                   echo "$1 is same $2"
  
                elif [ $1 -gt $2 ];then
  
                   echo "max is $1"
  
                else
  
                   echo "max is $2"
  
                fi
  
        结果:  [root@magedu md0]# bash sum.sh 2 3
  
                  max is 3
  
                [root@magedu md0]# bash sum.sh 2 2
  
                  2 is same 2
  
                [root@magedu md0]# bash sum.sh 3 2
  
                  max is 3
  
                [root@magedu md0]# bash sum.sh 3
  
                  Unknow
  shell脚本之用户交互:
  read [option] 。。。。
  -p:提示符
  -t:timetout
  写一个脚本,提示用户输入一个字符串,如果输入的是quit,则退出,否则输出其输入的内容
        脚本:#!/bin/bash  
              #
  
              read -p "please give me two charcet: " char
  
              if [ $char == "quit" ];then
  
                 exit 1
  
              else
  
                 echo "$char"
  
              fi
  
        结果:[root@magedu md0]# bash sum.sh
  
               please give me two charcet: quit
  
              [root@magedu md0]# bash sum.sh
  
               please give me two charcet: hello
  
               hello
  磁盘高级管理:
  RAID:磁盘冗余阵列
  表示多个独立的硬盘按照不同的方式组合起来,形成一个虚拟的硬盘来提升性能和冗余。
  可以解决的问题:
  提供IO能力、提供磁盘的耐用性,RAID在管理和扩展、在性能上及在可靠性和可用性上都有优势
  镜像冗余:比如raid1
  1、镜像冗余使用了磁盘镜像的技术
  2、磁盘镜像是一个简单的虚拟化技术,每个I/O操作都会在两个磁盘上执行,两个磁盘看起来像一个磁盘一样
  3、镜像冗余可以提高磁盘的读性能
  校验冗余:raid3  raid5
  1、根据冗余算法计算阵列中成员磁盘上数据的校验信息,将校验信息保存在
  2、其他的磁盘资源上
  3、保证了数据的可靠性
  4、和镜像冗余相比,校验冗余的开销更小
  RAID实现的方式:
  1、外接式磁盘阵列:通过扩展卡提供适配能力
  2、内接式磁盘阵列:主板集成RAID控制器
  3、software RAID:软磁盘阵列
  RAID0:已条带的形式将数据均匀分布在阵列的各个磁盘上
  组成:至少2个
  优点:极高的磁盘读写速率、不存在校验,不占用太多CPU资源
  缺点:无冗余,不能应用于对数据安全性较高的环境
DSC0000.png

  RAID1:已镜像为冗余方式,对虚拟磁盘上的数据进行多分拷贝,放在磁盘成员上
  组成:至少2个
  优点:具有100%数据冗余性,提高最高的数据安全保障,理论上可以实现2倍的读取速率
  缺点:开销大,磁盘利用率只有50%,在写性能上提示不大
DSC0001.png

  RAID3:数据块被分为更小的块并行传输到各个成员磁盘上,同时计算XOR校验数据并存放到专用的校验磁盘上
  组成:至少3块
  优点:读写性能都比较好,当磁盘损坏时,对整体吞吐量影响较少,减少了开销
  缺点:控制器设计复杂,校验磁盘的写性能有瓶颈
DSC0002.png

  RAID5:  采用独立存取的阵列方式,校验信息被均匀的分散到阵列的各个磁盘上
  组成:至少3个
  优点:读性能比较高,中等的写性能,校验信息的分布式存取,避免出现写操作的瓶颈
  缺点:控制器设计复杂,磁盘重建的过程比较复杂
DSC0003.png

  RAID10:结合RAID1和RAID0,先镜像,在条带化
  组成:最低4个
  优点:读性能很高,写性能比较好,数据安全性好,允许同时有N个磁盘失效
  缺点:磁盘空间开销大,利用率只有50%、
DSC0004.png

  RAID50: 结合RAID5和RAID0,先实现RAID5,在条带化
  组成:至少6个
  优点:比RAID5有更好的读性能,比相同容量的RAID5重建时间更短,可以容许N个磁盘同时失效
  缺点:设计复杂,比较难实现,同一个RAID5组内的两个磁盘失效会导致整个阵列的失效
DSC0005.png

  在做多RAID组合当中,RAID0的性能最好,RAID1的数据冗余度最高,相同容量下RAID和RAID1的磁盘开销最大。
  软RAID阵列,比如用mdadm工具
  mdadm命令:
  选项:
  -C:创建
  -A:装配
  -F:监控
  -f:人为的损坏  -r(移除)  -a(添加)
  -n # 使用#个设备来创建次RAID
  -l # 指定要创建的RAID级别
  -a (yes|no)自动创建目标RAID设备文件
  -c 指定块大小
  -x # 指定空闲盘个数
  -D 显示raid的详细信息
  -S 停止RAID
  示例:创建一个RAID1阵列,要求文件系统为ext4,有一个空闲盘,开机自动挂载到/md0目录下。
  先创建三个Linux raid autodetect磁盘
  /dev/sdb5        12587008    12791807      102400   fd  Linux raid autodetect
  /dev/sdb6        12793856    12998655      102400   fd  Linux raid autodetect
  /dev/sdb7        13000704    13205503      102400   fd  Linux raid autodetect
     [root@magedu md0]# mdadm -C /dev/md127 -n 2 -l 1 -a yes -c 1M -x 1 /dev/sdb[5,6,7]  
     [root@magedu md0]# mdadm -D /dev/md127
DSC0006.png

  可以人为的损坏:mdadm /dev/md127 -f /dev/sdb5
  可以移除:mdadm /dev/md127 -r /dev/sdb5
  可以添加:mdadm /dev/dm127 -a /dev/sdb5



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-557583-1-1.html 上篇帖子: 用shell编程实现打印九九乘法表 下篇帖子: 使用SHELL完成两个数字的大小比较
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表