Engineer1

真机上:还原三台虚拟机classroom、server、desktop

[root@room9pc14 桌面]# rht-vmctl reset classroom
[root@room9pc14 桌面]# rht-vmctl reset server
[root@room9pc14 桌面]# rht-vmctl reset desktop

真机远程管理:ssh方式,方便使用server与desktop   

[root@room9pc14 桌面]# ssh  用户名@IP地址

补充快捷键: Ctrl+Shift+t 开启一个新的终端

[root@room9pc14 桌面]# ssh -X root@172.25.0.11

##################################################

Shell脚本

  • 脚本: 可以执行文件,实现某种功能

  • 提前设计可执行语句,用来完成特定任务的文件(命令的堆积)


规范Shell脚本的一般组成
 • #! 环境声明(Sha-Bang) 以下所有代码,用那个程序解释
 • # 注释文本
 • 可执行代码

[root@server0 ~]# cat /root/hello.sh
  #!/bin/bash
  echo hello world
  hostname
  uname -r
  ifconfig | head -2 | tail -1
  cat  /etc/redhat-release


[root@server0 ~]# /root/hello.sh

####################################################
 重定向输出

   >  : 只收集正确信息的重定向
   2>: 只收集错误信息的重定向
   &>: 收集正确与错误信息的重定向


[root@server0 ~]# echo 123 > /opt/1.txt
[root@server0 ~]# cat /opt/1.txt
[root@server0 ~]# cat /etc

[root@server0 ~]# cat  /opt/1.txt  /etc/
[root@server0 ~]# cat  /opt/1.txt  /etc/ > /mnt/a.txt
[root@server0 ~]# cat /mnt/a.txt

[root@server0 ~]# cat /opt/1.txt /etc/ 2> /mnt/a.txt
[root@server0 ~]# cat /mnt/a.txt

[root@server0 ~]# cat /opt/1.txt /etc/ &> /mnt/a.txt
[root@server0 ~]# cat /mnt/a.txt


 运算:
[root@server0 ~]# echo 1+2  | bc     

[root@server0 ~]# echo 2*3  | bc

[root@server0 ~]# echo 4/2  | bc

[root@server0 ~]# echo 10%3 | bc    #取余数运算

 $( ):将命令的输出结果,作为参数

[root@server0 ~]# rm -rf /opt/*
[root@server0 ~]# cd /opt/

[root@server0 opt]# date
Tue Dec 19 20:07:29 CST 2017
[root@server0 opt]# date  +%F   #输出年-月-日
2017-12-19


[root@server0 opt]# mkdir $(date  +%F)     #创建年-月-日为目录的文件夹
[root@server0 opt]# ls
2017-12-19


[root@server0 opt]# mkdir mydir-$(date  +%F)
[root@server0 opt]# ls

mydir-2017-12-19

[root@server0 opt]# mkdir $(hostname)-$(date  +%F)
[root@server0 opt]# ls

  ''(单引号):取消特殊字符的意义

[root@server0 /]# echo  '* >'

[root@server0 /]# echo  '* > ? {} [] ~'

#####################################################

  /dev/null:黑洞设备

    变量:为了增加脚本适用环境的能力,以及方便适用

    变量作用:以不变的名称,存储变化的值(容器)

  read 产生交互:为了降低脚本的使用难度

[root@server0 /]# cat  /root/user.sh
 #!/bin/bash
 read   -p   '请输入您要创建的用户名:'       user
 useradd  $user  &>  /dev/null
 echo  $user用户创建成功
 echo  123  |  passwd  --stdin  $user   &> /dev/null
 echo  $user用户密码设置成功

[root@server0 /]#  /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用户密码设置成功

#################################################
  变量的定义

• 以不变的名称存放的可能会变化的值
– 变量名=变量值
– 方便以固定名称重复使用某个值
– 提高对任务需求、运行环境变化的适应能力

• 设置变量时的注意事项
– 若指定的变量名已存在,相当于为此变量重新赋值
– 等号两边不要有空格
– 变量名由字母/数字/下划线组成,区分大小写
– 变量名不能以数字开头,不要使用关键字和特殊字符

• 基本格式
– 引用变量值:$变量名
– 查看变量值:echo $变量名、echo ${变量名}

[root@server0 /]# a=rhel
[root@server0 /]# echo $a
[root@server0 /]# echo ${a}

[root@server0 /]# echo $a7

[root@server0 /]# echo ${a}7




环境变量
• 常见的环境变量
– USER(当前登陆的用户)
– RANDOM(储存一个随机数)

位置变量
• 在执行脚本时提供的命令行参数
   – 表示为 $n,n为序号
   – $1、$2、.. .. ${10}、${11}、.. ..

 [root@server0 /]# vim /root/2.sh

  #!/bin/bash
  echo $1
  echo $2
  echo $3

 [root@server0 /]# /root/2.sh  hello  tom   harry

 [root@server0 /]# vim /root/3.sh

  #!/bin/bash
   cat  -n  $1  |  head -$2

 [root@server0 /]# /root/3.sh  /etc/passwd   3

预定义变量
 
  $#  已加载的位置变量的个数
  $*  所有位置变量的值
  $?  程序退出后的状态值,0表示正常,其他值异常


[root@server0 ~]# cat /root/3.sh
 #!/bin/bash
 echo $1
 echo $2
 echo $#
 echo $*

[root@server0 ~]# /root/3.sh haha xixi hehe  lele

######################################################
常用的测试选项
• 检查文件状态
  -e:存在为真
  -d:存在且为目录才为真
  -f:存在且为文件才为真
  -r:存在且具备读取权限才为真
  -w:存在且具备写入权限才为真
  -x:存在且具备执行权限才为真

• 比较整数大小(带e字母的都有“等于”二字)
   -gt:大于
   -ge:大于等于
   -eq:等于
   -ne:不等于
   -lt:小于
   -le:小于等于

• 字符串比对
      ==:相等为真
      !=:不相等为真

####################################################

if双分支处理

 if [条件];then
     命令序列xx
 else
     命令序列yy
 fi

  请书写脚本:
       用户输入一个用户名,判断用户是否存在
       如果存在 输出用户/etc/passwd相应一行
       如果不存在 则创建该用户

[root@server0 ~]# vim /root/6.sh

    read  -p  '请输入一个用户名:'    user
    id  $user &> /dev/null
    if  [  $? -eq 0 ];then
         grep $user /etc/passwd
     else
          useradd $user
          echo $user 创建成功
     fi
[root@server0 ~]# /root/6.sh


         请书写脚本:
                 计算机随机产生一个10以内的随机数
                 用户随机输入一个10以内的随机数
                 如果相等,则中奖了
                 如果不相等,则谢谢回顾

[root@server0 ~]# vim /root/7.sh

#!/bin/bash
 read  -p   '请输入一个10以内的随机数字:'      num1
 num2=$(echo $RANDOM % 10 | bc)
 if [  $num1  -eq  $num2  ];then
    echo 恭喜您,中奖了
 else
    echo 恭喜您,谢谢回顾
    echo 正确数字为$num2
 fi

[root@server0 ~]# /root/7.sh
       

if多分支处理

 if [条件1] ; then
      命令序列xx
 elif [条件2] ; then
      命令序列yy
 elif [条件3] ; then
      命令序列aa
 else
       命令序列zz
 fi

       请书写脚本:
           请用户输入积分.
               如果用户的积分大于等于90,输出 vip plus
               如果用户的积分大于等于80,输出 vip
               如果用户的积分大于等于70,输出 老司机
               如果用户的积分大于等于60,输出 新手
               以上均不满足,输出 仍需努力

[root@server0 ~]# vim /root/8.sh
  #!/bin/bash
  read -p '请用户输入积分:'   num
  if [  $num  -ge  90  ];then
      echo  VIP PLUS
  elif [  $num  -ge  80  ];then
      echo VIP
  elif [  $num  -ge  70  ];then
      echo 老司机
  elif [  $num  -ge  60  ];then
      echo 新手
  else
      echo 仍需努力
  fi

##################################################

案例4:编写一个判断脚本
在 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 [ $# -eq 0 ];then
   echo '/root/foo.sh redhat|fedora' >&2
   exit 2
 elif [ $1 == redhat ];then
    echo fedora
 elif [ $1 == fedora ];then
    echo redhat
 else
   echo  '/root/foo.sh redhat|fedora'  >&2
   exit 3
 fi

[root@server0 ~]#  /root/foo.sh
[root@server0 ~]#  echo $?
[root@server0 ~]#  /root/foo.sh 2> /opt/2.txt
[root@server0 ~]#  cat /opt/2.txt

##################################################

 for循环结构
 
  循环作用:让计算机,反复执行重复性的操作


    for 变量  in  值列表
     do
            执行的动作
     done

[root@server0 ~]# vim /root/10.sh
        #!/bin/bash
      for  user  in  kenji  natasha  tom  harry  jack
      do
           useradd $user
             echo $user 成功
      done


[root@server0 ~]# /root/10.sh


#######################################################

posted @ 2017-12-05 08:48  百川汇海  阅读(208)  评论(0)    收藏  举报