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

shell学习之编程基础知识

[复制链接]

尚未签到

发表于 2018-8-23 06:38:36 | 显示全部楼层 |阅读模式
  有学过编程语言的同学们都能够很快入手shell因为基础的字符类型,循环语句与C语言也差不多。以下我们来了解以下新手基础:
  1.在学习循环语句之前先了解一些基础的字符信息:
  $0、$1、$2、$?、$*、$#
  $0 代表sh程序自己,例如: sh auto_system_backup.sh ,那么这里的$0就是auto_system_backup.sh
  Usage: { $0 /boot /etc} 这是编程中的提示信息:得到的显示结果是Usage: { auto_system_backup.sh /boot /etc}
  $1代表的是执行脚本后面的第一个参数,例如:sh auto_system_backup.sh  /ect/ /tmp/ 那么这里的$1就是/ect/ ,自然/tmp/ 是$2
  当我们需要选择性的执行某些任务时$1等就会排上用场,例如:上面几张博文中提到的选择备份数据库中就用到了$1
  ------------------------------------------------------------------------------------------------
  if [ -z "$1" ];then
  echo -e "\033[32mUsage:\nPlease Enter DataBase that you will backup \n-------------------------------\n\nUsage: { $0 mysql } \033[0m"
  exit
  fi
  -------------------------------------------------------------------------------------------------
  $?表示以上命令执行都没有错误,如果没有就返回0,主要用在代码中检查错误,如果有错就提示或者不再执行下面的代码
  -------------------------------------------------------------------------------------------------
  if [ $? -eq 0 ];then
  echo -e "\033[32mThe Mysql Backup $MYSQLDB Successfully!\033[0m"
  else
  echo -e "\033[32mThe Mysql Backup $MYSQLDB Failed,Please check.\033[0m"
  fi
  ----------------------------------------------------------------------------------------------------
  $* 代表的是执行脚本后面的所有参数
  ------------------------------------------------------------------------------
  if [ -z "$*" ];then
  echo -e "\033[32mUsage:\nPlease Enter Your Backup Files or Directories\n-------------------------------\n\nUsage: { $0 /boot /etc} \033[0m"
  exit
  fi
  ---------------------------------------------------------------------------------
  $#表示的是执行脚本后面的所有参数的个数
  以下一个脚本var02.sh可以显示以上的参数效果:
  -----------------------------------------
  #!/bin/bash
  #define path variables
  #by authors robin 2017
  echo "#####################"
  echo "The \$1 is $1"
  echo "The \$2 is $2"
  echo "The \$? is $?"
  echo "The \$* is $*"
  echo "The \$# is $#"
  -----------------------------------------
  执行脚本:sh var02.sh abc edf
  结果如下:
  #####################
  The $1 is abc
  The $2 is edf
  The $? is 0
  The $* is abc edf
  The $# is 2
  ---------------------------------
  2.接下来了解一些基础的逻辑运算符:
  -f 判断文件是否存在 eg: if [-f filename]
  -d 判断目录是否存在 eg: if [-d dir]
  eq 等于      应用于:整型比较
  -ne 不等于   应用于:整型比较
  -lt 小于      应用于:整型比较
  -gt 大于      应用于:整型比较
  -le 小于或等于   应用于:整型比较
  -ge 大于或等于   应用于:整型比较
  -a 双方都成立(and)    逻辑表达式 -a 逻辑表达式
  -o 单方成立(or)          逻辑表达式 -o 逻辑表达式
  -z 空字符串  :-z "$*" 这里的$*和$1都要以字符的形式出现
  ------------------------------------
  在以上的一些脚本你们也可以看到它们的身影,再仔细看看他们是起了什么效果自然也就知道了。剩下的在以后脚本解析中大家自己去理解
  3.循环语句:for if while 等
  三个判断语句都是编程中的基础之基础,在逻辑运算中也就是他们之间的互相嵌套来处理。以下给出几个简单的例子:
  if语句:
  一次判断语句,判断出[]中为0就执行之后的语句
  --------------------- if_files_exist00.sh-------------------
  #!/bin/bash
  #juge dir exist
  #fome net  2017
  if [ ! -d /home/test1 ];then
  mkdir -p /home/test1
  else
  echo "This DIR is exist ,Please exist....."
  fi
  -------------------------------------------
  以上的代码解释:如果/home/test1这个目录不存在我们就创建它如果存在就提示信息,结合上面的$1稍微修改一下它
  ------------------ if_files_exist01.sh------------------------
  #!/bin/bash
  #juge dir exist
  #from net 2017
  DIR=$1
  if [ ! -d $1 ];then
  mkdir -p $1
  else
  echo "The dir $1 is exist ,Please exit....."
  fi
  ---------------------------------------------------------------
  sh if_files_exist01.sh /home/test02   --这里执行该脚本就要手动的添加参数了
  在以上的脚本中我们还可以再加一个提示信息,提示用户输入参数。也就是判断$1是否为空,这里我就不多写了,自己结合前面的代码修改吧!
  elif语句:
  -------------------输入的分数判断优劣-----------------------------
  #!/bin/bash
  #juge scores
  #from net 2017
  scores=$1
  if [ -z $scores ];then
  echo "Usage:{$0 60|80.}"
  exit
  fi
  if [[ $scores -gt 85 ]];then
  echo "very good!";
  elif [[ $scores -gt 75 ]];then
  echo "good!";
  elif [[ $scores -ge 60 ]];then
  echo "pass!";
  else
  echo "no pass!";
  fi
  ------------------------------------------------------
   DSC0000.png
  
  for语句:
  多次判断,只要条件成立就一直循环处理
  ----------------以下的代码是计算1-15相加的总和---------
  #!/bin/bash
  j=0
  for i in `seq 1 15`
  do
  j=`expr $i + $j`   --这里相当于C语言中j=i+j
  done
  echo $j
  ---------------------
  while语句:
  也是多次判断直到条件不成立为止
  ------------------------------------
  #!/bin/bash
  i=0
  while (( $i < 10))
  do
  echo "The number is $i"
  ((i++))
  done
  ----------------------------
  select语句:
  这语句主要用于选取,并获得选取的值,以下程序运行选取的2那么就会获得$i的值为数组中的第二个
  语法结构:
  select i in "1" "2" "3";
  do
  代码。。。。。。。
  done
  ----------------------------------
  #!/bin/bash
  select i in "Centos" "Redhat" "ubuntu";
  do
  echo "Select you use system:"$i;
  done
  --------------------------------------
   DSC0001.png
  这个select语句大部分时候是结合case语句来处理问题
  case语句:   在编写大型自动化脚本中占很重要的地位
  ---------------------------以下代码主要是用于选择性执行程序代码--------------
  #!/bin/bash
  #auto install LAMP
  #from net 2017
  case $1 in
  Apache)
  echo "Wait install httpd server...."
  tar -jxvf httpd-2.2.27.tar.bz2;cd httpd-2.2.27
  ;;
  Mysql)
  echo "Wait install mysql server...."
  ;;
  PHP)
  echo "Wait install mysql server...."
  ;;
  *)
  echo -e "\033[32mUsage:{$0 Apache|Mysql|PHP|help} \033[0m"
  ;;
  esac
  ----------------------------------------------------------------------------
  我们看看执行效果:
DSC0002.png

  很显然在后面接了参数后就开始执行在该模块下的代码,每个模块下我们可以写任何的shell代码去执行。在后期的大规模服务部署中完全可以将所有代码揉在其中嘛。比如自动安装服务、配置服务,数据库备份、数据库恢复,目录数据同步、版本升级等等。都可以但是为了不要弄的很复杂建议不要写太多的功能在其中。以下结合case和select写一个简单的没有具体执行任务的小脚本:
  --------------------------------auto_lamp_case01.sh---------------------------------------
  #!/bin/bash
  #auto install LAMP
  #fom net 2017
  PS3="Select your will exec Menu:"
  select i in "Apache" "Mysql" "PHP"
  do
  case $i in
  Apache)
  echo "Wait install httpd server...."
  tar -jxvf httpd-2.2.27.tar.bz2;cd httpd-2.2.27
  ;;
  Mysql)
  echo "Wait install mysql server...."
  ;;
  PHP)
  echo "Wait install mysql server...."
  ;;
  *)
  echo -e "\033[32mUsage:{$0 Apache|Mysql|PHP|help} \033[0m"
  ;;
  esac
  done
  ------------------------------------------------------------------------
  由于在每个模块下只有简单的显示代码,我们可以在后期根据自己的需要将代码完善,执行效果如下
DSC0003.png

  很显然这个代码更智能一些,在执行程序后可以提示更多选择,在这个脚本上可以扩展出很多东西从而实现更多的自动化处理。


运维网声明 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.iyunv.com/thread-555251-1-1.html 上篇帖子: Shell脚本的循环:重复执行命令 下篇帖子: shell环境变量
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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