Linux shell脚本入门

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux shell脚本入门相关的知识,希望对你有一定的参考价值。

两台虚拟机,均要检测


1. Yum是否可用

2.  防火墙默认区域修改为trusted

3. IP地址是否配置


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


二、普通用户(必须还原环境)

  

     客户端普通用户访问服务端nfs-server服务,

     服务端会以客户端相同UID身份的本地用户进行权限判定


    LDAP :  网络用户,提供用户名

    kerberos : 密码验证,实现“一次密码认证,多次免密登录”的通行证机制



1.两台虚拟机都运行脚本,加入LDAP与kerberos

  

  # lab nfskrb5 setup


2.服务端修改配置文件,创建读写的共享

[[email protected] ~]# mkdir /test

[[email protected] ~]# vim /etc/exports


   /test  *(rw,sec=krb5p)


3.服务端部署加密的密钥

# wget http://172.25.254.254/pub/keytabs/server0.keytab  -O /etc/krb5.keytab


# ls  /etc/krb5.keytab


4.服务端 重起 nfs-server 与 nfs-secure-server 


# systemctl restart  nfs-server  nfs-secure-server 


5.服务端保证ldapuser0用户有写权限,设置本地权限

[[email protected] ~]# setfacl -m u:ldapuser0:rwx /test

[[email protected] ~]# getfacl /test


6.客户端访问与挂载共享

[[email protected] ~]# showmount -e 172.25.0.11

[[email protected] ~]# mkdir /mnt/nfs

[[email protected] ~]# vim /etc/fstab 


 172.25.0.11:/test  /mnt/nfs  nfs  _netdev,sec=krb5p  0  0


7.客户端部署密钥文件,重起相关的服务

# wget http://172.25.254.254/pub/keytabs/desktop0.keytab  -O /etc/krb5.keytab


# systemctl restart nfs nfs-secure


8.客户端验证挂载,写入(必须采用ssh方式,su不经过kerberos验证)

[[email protected] ~]# mount -a

[[email protected] ~]# df -h


[[email protected] ~]# ssh  [email protected]


[[email protected] ~]$ cd /mnt/nfs/

[[email protected] nfs]$ touch 1.txt

[[email protected] nfs]$ ls

1.txt

[[email protected] nfs]$ exit


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

 Shell脚本


     脚本:可以执行文件,运行后可以实现某种功能(命令的堆积,非交互)



规范Shell脚本的一般组成

#! 环境声明(Sha-Bang)

# 注释文本

可执行代码




一、书写第一脚本程序

[[email protected] ~]# vim /root/1.sh 


 #!/bin/bash

 echo hello world

 hostname

 cat  /etc/redhat-release

 ifconfig | head -2  | tail -1


[[email protected] ~]# /root/1.sh


二、书写为Server0自动搭建Yum的脚本

[[email protected] ~]# vim /root/yum.sh 

 #!/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


[[email protected] ~]# chmod +x /root/yum.sh

[[email protected] ~]# /root/yum.sh

管道传递

使用 | 管道操作

– 将前一条命令的标准输出交给后一条命令处理



三、重定向输出


    >:只收集前面命令的正确输出

    2>:只收集前面命令的错误输出

    &>:收集前面命令的错误与正确输出


[[email protected] ~]# echo 123 > /opt/1.txt

[[email protected] ~]# cat /opt/1.txt


[[email protected] ~]# cat /opt/1.txt /etc/

[[email protected] ~]# cat /opt/1.txt /etc/ > /opt/a.txt

[[email protected] ~]# cat /opt/a.txt


[[email protected] ~]# cat /opt/1.txt /etc/ 2> /opt/a.txt

[[email protected] ~]# cat /opt/a.txt


[[email protected] ~]# cat /opt/1.txt /etc/ &> /opt/a.txt

[[email protected] ~]# cat /opt/a.txt


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

三、书写创建用户并设置密码的脚本

     /dev/null  #Linux黑洞设备,专用于收集不要的输出结果


[[email protected] ~]# vim /root/user.sh


 #!/bin/bash

 useradd test06 &> /dev/null

 echo test06创建成功

 echo 123 | passwd --stdin test06 &> /dev/null

 echo test06密码设置成功


[[email protected] ~]#  chmod +x /root/user.sh

[[email protected] ~]# /root/user.sh

  

   变量:为了增加脚本的适用环境的能力,增加脚本的灵活度,方便。


   变量: 容器,以不变的名称,储存变化的值


      变量名=变化的值


  使用变量:    $变量名



   为了降低脚本使用难度,可以产生交互

  read   :可以产生交互,将键盘输入的内容赋值给变量



[[email protected] ~]# 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密码设置成功


[[email protected] ~]# /root/user.sh


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

什么是变量

以不变的名称存放的可能会变化的值

– 变量名=变量值

– 方便以固定名称重复使用某个值

– 提高对任务需求、运行环境变化的适应能力



设置变量时的注意事项

– 若指定的变量名已存在,相当于为此变量重新赋值

– 等号两边不要有空格

– 变量名由字母/数字/下划线组成,区分大小写

– 变量名不能以数字开头,不要使用关键字和特殊字符



基本格式

– 引用变量值:$变量名

– 查看变量值:echo $变量名、echo ${变量名}



 变量的种类




位置变量

在执行脚本时提供的命令行参数(非交互式传值)


[[email protected] ~]# vim  /root/2.sh

 #!/bin/bash

 echo $1

 echo $2

 echo $3

 echo ${10}

 echo ${11}


# /root/2.sh haha  benniu  xixi  hehe   lele   dc  tc   dz   tz 100 200


[[email protected] ~]# vim /root/3.sh

  #!/bin/bash

  cat -n $1  |  head -$2 


[[email protected] ~]# /root/3.sh /etc/passwd   2

[[email protected] ~]# /root/3.sh /etc/passwd   3




 预定义变量

  用来保存脚本程序的执行信息

– 直接使用这些变量

– 不能直接为这些变量赋值


  $#  已加载的位置变量的个数

$*  所有位置变量的值

$?  程序退出后的状态值,0表示正常,其他值异常




[[email protected] ~]# vim /root/2.sh 


 #!/bin/bash

 echo $1

 echo $2

 echo $3

 echo ${10}

 echo ${11}

 echo $#

 echo $*


[[email protected] ~]# /root/2.sh  1  2 3 4 5 6 7 8 9 10 11



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

 运算 

  

[[email protected] ~]# expr 10 / 3


[[email protected] ~]# expr 10 \* 3


[[email protected] ~]# expr 1 + 2


[[email protected] ~]# expr 3 - 1


[[email protected] ~]# expr 10  %  3    #取余数 运算


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


[[email protected] opt]# date

[[email protected] opt]# date +%F

[[email protected] opt]# cd /opt


[[email protected] opt]# mkdir   $(date +%F)

[[email protected] opt]# ls

[[email protected] opt]# mkdir   mydir-$(date +%F)

[[email protected] opt]# ls

[[email protected] opt]# mkdir   MariaDB-$(date +%F)

[[email protected] opt]# ls

[[email protected] opt]# mkdir   $(hostname)-$(date +%F)


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

常用的测试选项


检查文件状态

-e:文档存在为真

-d:文档存在且为目录为真

-f:文档存在且为文件为真

-r:文档存在且有读取权限为真

-w:文档存在且有写入权限为真

-x:文档存在且有执行权限为真


比较整数大小(带e都有等于二字,g代表大于,l代表小于)


-gt:大于

-ge:大于等于

-eq:等于

-ne:不等于

-lt:小于

-le:小于等于


字符串比对

== :相等

!=:不相等



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




 if [ 条件测试 ] ; then

     命令序列xx

 else

     命令序列yy

 fi


[[email protected] /]# vim  /root/5.sh

 #!/bin/bash

 if  [ $1 -eq $2 ];then

   echo hello

 else

   echo hi

 fi


[[email protected] /]# /root/5.sh  1 1 


[[email protected] /]# /root/5.sh  1 2



   请书写一个脚本:

      用户输入一个IP地址(read),判断是否可以与该IP地址通信,

   能通则输出 "IP ok"   否则 输出 "IP no"


[[email protected] /]# vim  /root/6.sh


   #!/bin/bash

   read  -p  ‘请输入一个IP地址:‘    ip

   ping  -c  2  $ip  &> /dev/null


     if [ $? -eq 0 ];then

          echo  ${ip} ok

      else

          echo  ${ip} no 

     fi 


[[email protected] /]#   /root/6.sh


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



 if [条件测试1] ; then

      命令序列xx

 elif [条件测试2] ; then

      命令序列yy

 else

      命令序列zz

 fi

  

     

    成绩    大于等于90    优秀

 大于等于80    良好             

 大于等于70    及格  

 大于等于60    仍需努力  

 60以下          在牛的肖邦,也弹不出哥忧伤





[[email protected] ~]# vim /root/8.sh

#!/bin/bash

 read -p  ‘请输入您的成绩:‘     num

if [ $num -gt  100 ];then

     echo 成绩有误

  elif [ $num -lt 0 ];then

     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








     ‘ ‘:把所有的特殊字符,当作普通文本字符输出


[[email protected] ~]# 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


[[email protected] ~]# /root/foo.sh redhat

[[email protected] ~]# /root/foo.sh fedora


[[email protected] ~]# /root/foo.sh haha





 #!/bin/bash

 if [ $# -eq 0 ];then

   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‘

 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                                   #脚本退出返回值

 fi


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

 for循环结构


  循环结构:将反复执行的语句,循环去执行



  for 变量名 in   值列表

  do

        命令序列

  done





[[email protected] /]# vim  /root/for.sh

  #!/bin/bash

  for a in 1 2 3 4 5

  do

    useradd nsd$a

    echo nsd$a创建成功

  done


[[email protected] /]# 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://classroom/pub/materials/userlist


 

# wget http://classroom/pub/materials/userlist 


[[email protected] /]# 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


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




 #!/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


以上是关于Linux shell脚本入门的主要内容,如果未能解决你的问题,请参考以下文章

linux shell 脚本 入门到实战详解[⭐建议收藏!!⭐]

linux shell 脚本 入门到实战详解[⭐建议收藏!!⭐]

Linux系统shell脚本入门之break

linux shell 脚本 入门到实战详解

linux shell 脚本 入门到实战详解

linux shell 脚本 入门到实战详解