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

Day01 Shell脚本编程

[复制链接]

尚未签到

发表于 2018-8-20 09:48:21 | 显示全部楼层 |阅读模式
一、shell环境及特性
1.1 什么是shell
  解释器:负责向内核翻译及传达用户/程序指令
  解释器 车
  shell 汽车
  bash 宝马、奔驰、法拉利
1.1.1 /etc/shells
  文件里面的内容就是系统已安装的解释器
1.1.2 usermod -s /bin/tsh zhangsan
  修改老用户的默认解释器
1.1.3 useradd -s /bin/tsh zhangsan
  创建新用户时指定默认解释器
1.2 Bash基本特性
1.2.1 快捷键
  ctrl+l清屏
  ctrl+c终止当前运行的程序
  ctrl+a移动光标到行首
  ctrl+e移动光标到行尾
  ctrl+w删除当前光标前面的一个单词
  esc+d删除当前光标后面的一个单词
  ctrl+u删除当前光标到行首的所有内容
  ctrl+k删除当前光标到行尾的所有内容
  ctrl+f向前移动一个字符
  ctrl+b向后移动一个字符
  alt+b 向前移动一个单词
  alt+f 向后移动一个单词
1.2.2 tab键补全
  RHEL7.2才支持补齐选项,老版本可通过bash-completion包提供选项补齐的功能
1.2.3 命令历史
  grep HISTSIZE /etc/profile#查看历史命令默认保存条数
  history | wc -l#查看当前使用了多少条命令
  !100#执行第100条命令
  !cat#从后到前,查找最近执行的cat命令
  history -c#清除历史命令
  ~/.bash_history
1.2.4 命令别名
  alias
  unalias
  /etc/bashrc
  ~/.bashrc
1.2.5 标准输入输出
  标准输出&1
  错误输出&2
  标准输入&0
1.2.6 重定向
  对脚本来说,重定向非常重要,相当于给执行脚本做了个日志记录
  1>正确输出 1>>正确追加输出
  2>错误输出 2>>错误追加输出
  &>将正常输出、错误输出重定向同一个文件
  /dev/null 2>&1 相当于1>/dev/null 2>/dev/null。是将标准出错重定向到标准输出,最后一个&表示取标准设备。
  echo 'error' >&2 把echo出来的结果 重定向到 错误输出.
  /etc/yum.repos.d/dvd.repo
  else
  mkdir -p /etc/yum.repos.d/
  echo '[dvd]
  name=rhel
  baseurl=http://192.168.4.254/rhel7
  gpgcheck=0' >/etc/yum.repos.d/dvd.repo
  fi
3.3 自动安装vsftpd
  #!/bin/bash
  yum clean all >/dev/null
  yum -y install vsftpd 2>/var/log/ins_vsftpd_err.log >/dev/null
  systemctl restart vsftpd && systemctl enable vsftpd >/dev/null
3.4 创建用户脚本
  #!/bin/bash
  read -p "请输入用户名:" name
  #关闭回显
  stty -echo
  read -p "请输入密码:" pass
  #打开回显
  stty echo
  useradd $name
  echo $pass | passwd --stdin $name
3.5 每周五备份一次/var/log,使用tar备份到/root目录下
  echo '03 03  5 tar -czf /root/log-$(date+%F).tar.gz /var/log' >>/var/spool/cron/root
3.6 每分钟检测当前计算机登录的用户数量,如果大于2,则发邮件报警
  思路:如何检测登录用户数量?如何判断大于2?如何发邮件?
  #!/bin/bash
  #判断本机登录的用户数是否大于2,如果大于2,则发邮件给root
  num=who|wc -l
  [ $num -gt 2 ] && mail -s Error root /dev/null
  done
3.10 输入数字求和,直到输入0后结束并输出和
  思路:读取键盘输入?求和并存在另一个变量内?如果输入0则结束循环并输出和
  #!/bin/bash
  RESULT=0
  while :
  do
  read -p "请输入一个数[0结束]:" NUM
  [ $NUM -eq 0 ] && break
  let RESULT+=$NUM
  done
  echo $RESULT
3.11 打印9*9乘法表
  实际屏幕输出:
  11=1
  21=2 22=4
  31=3 32=6 33=9
  ......
  91=9   92=18  93=27  94=36  95=45  96=54  97=63 98=72 9*9=81
  思路:i={1..9} j={?} 要打出三角形,核心是inum2>num3
  num1< num2< num3
  num2 < num3
  num2
  首先if判断num1和num2比大小。如果num1大,则把num1和num2交换,保证num1存放的是小值;如果num2大,则不做操作,结束这个判断
  然后再来个if判断num1和num3比大小。如果num1大,则把num1和num3交换,保证num1存放的是最小值;如果num3大,则不做操作,结束这个判断
  最后的if判断num2和num3比大小。如果num2大,则把num2和num3交换,保证num3存放的是最大值;如果num3大,则不做操作,结束这个判断。
  从小到大输出$num1 $num2 $num3
  #!/bin/bash
  #num1存最小值,num2存中间,num3存最大值
  num1=$RANDOM
  num2=$RANDOM
  num3=$RANDOM
  tmp=0
  if [ $num1 -gt $num2 ];then
  tmp=$num2;num2=$num1;num1=$tmp
  fi
  if [ $num1 -gt $num3 ];then
  tmp=$num1;num1=$num3;num3=$tmp
  fi
  if [ $num2 -gt $num3 ];then
  tmp=$num3;num3=$num2;num2=$tmp
  fi
  echo $num1 $num2 $num3
四、变量
  以固定名称来存放可能会变化的值
4.1 定义规则
  若指定的变量名存在,则相当于给变量赋值
  等号两边不能有空格
  只能用数字、字母和下划线组成
  不能以数字开头
4.2 赋值
4.2.1 直接赋值
  变量名=变量值
  FROM=/etc/
4.2.2 通过read获取变量值
  read -p &quot;提示&quot; 变量名#只定义变量名,不赋值。由使用该命令的人来赋值
4.2.3 使用命令行参数
  使用位置变量$1、$2等
4.2.4 管道接收命令的输出
  通过管道|把前面命令的输出作为现在命令的输入
4.3 引用
  $FROM
4.4 查看
  echo $FROM
  echo ${FROM}
4.5 环境变量
  配置文件:/etc/profile、~/.bashrc
  PATH
  HOME
  USER
  UID
  HOSTNAME
  PS1 一级提示符
  PS2 二级提示符
4.6 预定义变量
  $0:脚本自身的名字
  $1:位置变量1
  $2:位置变量2
  $:所有变量
  $ @ :所有变量。
  $和$@都表示传递给函数或脚本的所有参数,不被双引号(&quot; &quot;)包含时,都以&quot;$1&quot; &quot;$2&quot; … &quot;$n&quot; 的形式输出所有参数。
  但是当它们被双引号(&quot; &quot;)包含时,&quot;$*&quot; 会将所有的参数作为一个整体,以&quot;$1 $2 … $n&quot;的形式输出所有参数;&quot;$@&quot; 会将各个参数分开,以&quot;$1&quot; &quot;$2&quot; … &quot;$n&quot; 的形式输出所有参数。
  $#:所有变量的数量
  $$:脚本运行后的PID
  $!:显示最后一个被放到后台的进程PID
  $?:上一条命令执行状态,值等于0为正确,值非0就是错误
4.7局部变量和全局变量
4.7.1 局部变量
  自定义变量默认就是局部变量
  存在于脚本函数(function)中的变量也是局部变量。
  要以 local 变量名方式进行声明,使之只在本函数作用域内有效,防止变量在函数中的命名与变量外部程序中变量重名造成程序异常。
  局部变量默认只在当前shell环境中有效,无法在子shell环境中使用
  可以通过export命令将局部变量声明为全局变量
4.7.2 全局变量
  系统变量默认就是全局变量
  全局变量在当前shell环境及子、孙等shell环境中有效
  /etc/profile
  export 变量名#将局部变量声明为全局变量
  export -n 变量名#取消声明
五、单引号&双引号&反引号
5.1 双引号&quot;&quot;
  双引号可以界定一个完整的字符串
  echo a   b
  echo &quot;a   b&quot;
5.2 单引号''
  单引号可以界定一个完整的字符串,而且可以屏蔽特殊符号($\ ),原封不动输出。
5.3  反引号 ``
  命令 仅可以放命令,提取的是命令的结果
  $(命令) 仅可以放命令,提取的是命令的结果


运维网声明 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-554123-1-1.html 上篇帖子: shell 脚本之 Function 功能的使用 下篇帖子: unbound dns 安装 控制 shell 脚本
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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