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

linux学习笔记--工程师技术:shell脚本基础

[复制链接]

尚未签到

发表于 2018-8-24 08:50:16 | 显示全部楼层 |阅读模式
  Shell脚本
  脚本:可以执行文件,运行后可以实现某种功能(命令的堆积,非交互)
  规范Shell脚本的一般组成
  #! 环境声明(Sha-Bang)
  # 注释文本
  可执行代码
  #!/bin/bash   #环境声明,声明写的脚本是bash这个程序翻译的
  一、书写第一脚本程序
  [root@server0 ~]# vim /root/1.sh
  #!/bin/bash
  echo hello world
  hostname
  cat  /etc/redhat-release
  ifconfig | head -2  | tail -1
  [root@server0 ~]# /root/1.sh
  二、书写为Server0自动搭建Yum的脚本
  [root@server0 ~]# vim /root/yum.sh         #要注意排版,echo里的内容要顶行写,echo 后的'要在同一行
  #!/bin/bash
  rm -rf /etc/yum.repos.d/*
  echo '[dvd]
  name=dvd
  baseurl=http://172.25.254.254/content/rhel7.0/x86_64/dvd/
  enabled=1
  gpgcheck=0'  > /etc/yum.repos.d/haha.repo
  yum clean all
  yum repolist
  [root@server0 ~]# /root/1.sh       #显示权限不够,因为vim下写的都是普通的文本,需要赋予x执行权限
  -bash: /root/1.sh: 权限不够
  [root@server0 ~]# chmod +x /root/yum.sh
  [root@server0 ~]# /root/yum.sh
  管道传递
  使用 | 管道操作
  – 将前一条命令的标准输出交给后一条命令处理
  三、重定向输出
  >:只收集前面命令的正确输出,错误的显示在命令行
  2>:只收集前面命令的错误输出,正确的显示在命令行
  &>:收集前面命令的错误与正确输出,不显示在命令行
  [root@server0 ~]# echo 123 > /opt/1.txt
  [root@server0 ~]# cat /opt/1.txt
  123
  [root@server0 ~]# cat /opt/1.txt /etc/
  cat: /etc/: 是一个目录
  [root@server0 ~]# cat /opt/1.txt /etc/ > /opt/a.txt
  cat: /etc/: 是一个目录
  [root@server0 ~]# cat /opt/a.txt
  123
  [root@server0 ~]# cat /opt/1.txt /etc/ 2> /opt/a.txt
  123
  [root@server0 ~]# cat /opt/a.txt
  123
  [root@server0 ~]# cat /opt/1.txt /etc/ &> /opt/a.txt    #不显示
  [root@server0 ~]# cat /opt/a.txt
  123
  cat: /etc/: 是一个目录
  -------------------------------------------------------------------------------------------
  三、书写创建用户并设置密码的脚本
  [root@server0 ~]# vim /root/user.sh
  #!/bin/bash
  useradd test06
  echo 123 | passwd --stdin test06
  [root@server0 ~]#  chmod +x /root/user.sh
  [root@server0 ~]# /root/user.sh
  更改用户 test06 的密码 。
  passwd:所有的身份验证令牌已经成功更新。
  要使其不显示信息
  /dev/null  #Linux黑洞设备,专用于收集不要的输出结果
  [root@server0 ~]# vim /root/user.sh
  #!/bin/bash
  useradd test06 &> /dev/null
  echo test06创建成功
  echo 123 | passwd --stdin test06 &> /dev/null
  echo test06密码设置成功
  [root@server0 ~]#  chmod +x /root/user.sh
  [root@server0 ~]# /root/user.sh
  test06创建成功
  test06密码设置成功
  变量:为了增加脚本的适用环境的能力,增加脚本的灵活度,方便。
  变量: 容器,以不变的名称,储存变化的值
  变量名=变化的值
  使用变量:    $变量名
  为了降低脚本使用难度,可以产生交互
  read :可以产生交互,将键盘输入的内容赋值给变量
  [root@server0 ~]# vim /root/user.sh
  #!/bin/bash
  read  -p  '请输入您要建立的用户:'   user
  read  -p  '请输入您要设置的密码:'   pass
  useradd  $user  &> /dev/null
  echo $user创建成功
  echo $pass | passwd --stdin $user &> /dev/null
  echo $user密码设置成功
  [root@server0 ~]# /root/user.sh
  请输入您要创建的帐号:kobe
  请输入您要设置的密码:248
  kobe创建成功
  kobe密码设置成功
  -------------------------------------------------------------------------------------------
  什么是变量
  以不变的名称存放的可能会变化的值
  – 变量名=变量值
  – 方便以固定名称重复使用某个值
  – 提高对任务需求、运行环境变化的适应能力
  设置变量时的注意事项
  – 若指定的变量名已存在,相当于为此变量重新赋值
  – 等号两边不要有空格
  – 变量名由字母/数字/下划线组成,区分大小写
  – 变量名不能以数字开头,不要使用关键字和特殊字符
  基本格式
  – 引用变量值:$变量名
  – 查看变量值:echo $变量名,echo ${变量名}
  变量的种类
  位置变量
  在执行脚本时提供的命令行参数(非交互式传值)
  $加数字($1、$2、$3.....):脚本文件名后面带有参数的默认变量
  [root@server0 ~]# vim  /root/2.sh
  #!/bin/bash
  echo $1
  echo $2
  echo $3
  echo ${10}         #显示超过两位数的值要加{}
  echo ${11}
  echo $21           #不加{}则显示前一位的值再加后一位的值
  [root@server0 ~]# /root/2.sh haha  benniu  xixi  hehe   lele   dc  tc   dz   tz 100 200
  haha
  benniu
  xixi
  100                    #显示第十个值为100
  200                    #显示第十个值为200
  benniu1       #显示第二个值加个1为benniu1
  [root@server0 ~]# vim /root/3.sh
  #!/bin/bash
  cat -n $1  |  head -$2             # $1表示要查看的文件内容加行号,$2表示前两行
  [root@server0 ~]# /root/3.sh /etc/passwd   2
  1 root:x:0:0:root:/root:/bin/bash
  2 bin:x:1:1:bin:/bin:/sbin/nologin
  预定义变量
  用来保存脚本程序的执行信息
  – 直接使用这些变量
  – 不能直接为这些变量赋值
  $#  已加载的位置变量的个数
  $*  所有位置变量的值
  $?  程序退出后的状态值,0表示正常,其他值异常
  [root@server0 ~]# vim /root/2.sh
  #!/bin/bash
  echo $1
  echo $2
  echo $3
  echo ${10}
  echo ${11}
  echo $#
  echo $*
  [root@server0 ~]# /root/2.sh  1  2 3 4 5 6 7 8 9 10 11
  1
  2
  3
  10
  11
  21
  11                         #显示已加载的位置变量的个数为11
  1 2 3 4 5 6 7 8 9 10 11     #显示所有位置变量的值
  ----------------------------------------------------------------------------------------
  运算
  [root@server0 ~]# expr 10 / 3
  [root@server0 ~]# expr 10 \* 3     #单独*显示语法错误,前面加\表示乘号
  [root@server0 ~]# expr 1 + 2
  [root@server0 ~]# expr 3 - 1
  [root@server0 ~]# expr 10  %  3    #取余数 运算
  $() :将()里命令的输出结果,作为参数显示
  [root@server0 opt]# date
  [root@server0 opt]# date +%F    #只显示年月日
  [root@server0 opt]# cd /opt
  [root@server0 opt]# mkdir   $(date +%F)
  [root@server0 opt]# ls
  2017-11-07
  [root@server0 opt]# mkdir   mydir-$(date +%F)
  [root@server0 opt]# ls
  2017-11-07  mydir-2017-11-07
  [root@server0 opt]# mkdir   MariaDB-$(date +%F)
  [root@server0 opt]# ls
  2017-11-07  MariaDB-2017-11-07  mydir-2017-11-07
  [root@server0 opt]# mkdir   $(hostname)-$(date +%F)
  [root@server0 opt]# ls
  2017-11-07  mydir-2017-11-07   MariaDB-2017-11-07  server0.example.com-2017-11-07
  -------------------------------------------------------------------------------------------
  常用的测试选项
  检查文件状态
  -e:文档存在为真
  -d:文档存在且为目录为真
  -f:文档存在且为文件为真
  -r:文档存在且有读取权限为真
  -w:文档存在且有写入权限为真
  -x:文档存在且有执行权限为真
  比较整数大小(带e都有等于二字,g代表大于,l代表小于)
  -gt:大于
  -ge:大于等于
  -eq:等于
  -ne:不等于
  -lt:小于
  -le:小于等于
  字符串比对
  == :相等
  !=:不相等
  ----------------------------------------------------------------------------------------
  if单分支语句
  if [ 条件测试 ] ; then        #[]里一定要有空格
  命令序列xx
  else
  命令序列yy
  fi
  [root@server0 /]# vim  /root/5.sh
  #!/bin/bash
  if  [ $1 -eq $2 ];then
  echo hello
  else
  echo hi
  fi
  [root@server0 /]# /root/5.sh  1 1
  hello
  [root@server0 /]# /root/5.sh  1 2
  hi
  请书写一个脚本:
  用户输入一个IP地址(read),判断是否可以与该IP地址通信,能通则输出 "IP ok"   否则 输出 "IP no"
  [root@server0 /]# vim  /root/6.sh
  #!/bin/bash
  read  -p  '请输入一个IP地址:'  ip    #变量为ip
  ping  -c  2  $ip  &> /dev/null
  if [ $? -eq 0 ];then
  echo  ${ip} ok
  else
  echo  ${ip} no
  fi
  [root@server0 /]#   /root/6.sh
  请输入一个IP地址:127.0.0.1
  127.0.0.1 ok
  [root@server0 ~]# /root/6.sh
  请输入一个IP地址:1.1.1.1
  1.1.1.1 no
  -----------------------------------------------------------------------------------------
  if多分支语句
  if [条件测试1] ; then
  命令序列xx
  elif [条件测试2] ; then
  命令序列yy
  else
  命令序列zz
  fi
  成绩    大于等于90    优秀
  大于等于80    良好
  大于等于70    及格
  大于等于60    仍需努力
  60以下          在牛的肖邦,也弹不出哥忧伤
  [root@server0 ~]# vim /root/8.sh
  #!/bin/bash
  read -p  '请输入您的成绩:'     num
  if [ $num -gt  100 ];then        #大于100分
  echo 成绩有误
  elif [ $num -lt 0 ];then       #小于0分
  echo 成绩有误
  elif [ $num -ge 90 ];then
  echo 优秀
  elif [ $num -ge 80 ];then
  echo 良好
  elif [ $num -ge 70 ];then
  echo 及格
  elif [ $num -ge 60 ];then
  echo 仍需努力
  else
  echo 在牛的肖邦,也弹不出哥忧伤
  fi
  -----------------------------------------------------------------------------------------
  在 server0 上创建 /root/foo.sh 脚本
  1)当运行/root/foo.sh redhat,输出为fedora
  2)当运行/root/foo.sh fedora,输出为redhat
  3)当没有任何参数或者参数不是 redhat 或者
  fedora时,其错误输出产生以下信息:
  /root/foo.sh  redhat|fedora
  ' ':把所有的特殊字符,当作普通文本字符输出
  [root@server0 ~]# vim  /root/foo.sh
  #!/bin/bash
  if [  $1  ==  redhat  ];then
  echo  fedora
  elif [  $1  ==  fedora  ];then
  echo  redhat
  else
  echo  '/root/foo.sh  redhat|fedora'
  fi
  [root@server0 ~]# /root/foo.sh redhat
  [root@server0 ~]# /root/foo.sh fedora
  [root@server0 ~]# /root/foo.sh haha
  #!/bin/bash
  if [ $# -eq 0 ];then      #表示脚本文件后位置变量的个数为0时,即没有任何参数(不输入参数)
  echo '/root/foo.sh  redhat|fedora'
  elif [ $1 == redhat ];then
  echo fedora
  elif [ $1 == fedora ];then
  echo redhat
  else
  echo '/root/foo.sh  redhat|fedora'              #此输出为正确的,用echo$?验证为0
  fi
  " ":可以将 “没有” 变成 “ 空值”
  #!/bin/bash
  if [ "$1" == redhat ];then
  echo fedora
  elif [ "$1" == fedora ];then
  echo redhat
  else
  echo '/root/foo.sh  redhat|fedora'  >&2   #将正确输出变成错误
  exit 2                     #脚本退出返回值,即上一行命令为错时echo$?显示不为0的指定值2
  fi
  -------------------------------------------------------------------------------------------
  for循环结构
  循环结构:将反复执行的语句,循环去执行
  for 变量名 in   值列表
  do
  命令序列
  done
  [root@server0 /]# vim  /root/for.sh
  #!/bin/bash
  for a in 1 2 3 4 5
  do
  useradd nsd$a
  echo nsd$a创建成功
  done
  [root@server0 /]# vim  /root/for02.sh
  #!/bin/bash
  for a in 1 2 3 4 5
  do
  echo hello
  done
  -------------------------------------------------------------------------------------------
  案例5:编写一个批量添加用户脚本
  在 server0 上创建 /root/batchusers 脚本
  1)此脚本要求提供用户名列表文件作为参数
  2)如果没有提供参数,此脚本应该给出提示
  Usage:/root/batchusers,退出并返回相应值
  3)如果提供一个不存在的文件,此脚本应该给出提
  示 Input file not found,退出并返回相应值
  4)新用户的登录Shell为 /bin/false,无需设置密码
  5)用户列表测试文件:
  http://cla***oom/pub/materials/userlist
  # wgethttp://cla***oom/pub/materials/userlist
  [root@server0 /]# vim  /root/batchusers
  #!/bin/bash
  if [ $# -eq 0 ];then
  echo 'Usage: /root/batchusers' >&2
  exit 1
  fi
  if [ ! -e $1 ];then              # !表示不存在
  echo 'Input file not found' >&2
  exit 2
  fi
  for  a  in $(cat $1)
  do
  useradd -s /bin/false $a
  echo $a创建成功
  done
  [root@server0 ~]# cat userlist
  duanwu
  zhongqiu
  zhsan
  lisi
  [root@server0 ~]# /root/batchusers userlist    #可以自己创建别的用户
  duanwu创建成功
  zhongqiu创建成功
  zhsan创建成功
  lisi创建成功
  -----------------------------------------------------------------------------------------
  #!/bin/bash
  if [ $# -eq 0 ];then
  echo 'Usage: /root/batchusers' >&2
  exit 1
  fi
  if [ -e $1 ];then
  for  a  in $(cat $1)
  do
  useradd -s /bin/false $a
  echo $a创建成功
  done
  else
  echo 'Input file not found' >&2
  exit 2
  fi


运维网声明 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-555768-1-1.html 上篇帖子: shell特殊符号,cut、sort、wc、uniq、tee、tr、split命令 下篇帖子: Linux shell基础(四)正则表达式与grep命令 beta-Linux学习之路
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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