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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux学习笔记--工程师技术:shell脚本基础相关的知识,希望对你有一定的参考价值。

 Shell脚本


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


规范Shell脚本的一般组成

#! 环境声明(Sha-Bang)

# 注释文本

可执行代码


#!/bin/bash   #环境声明,声明写的脚本是bash这个程序翻译的




一、书写第一脚本程序

[[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         #要注意排版,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


[[email protected] ~]# /root/1.sh       #显示权限不够,因为vim下写的都是普通的文本,需要赋予x执行权限

-bash: /root/1.sh: 权限不够

[[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


-------------------------------------------------------------------------------------------

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

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

 #!/bin/bash

 useradd test06

 echo 123 | passwd --stdin test06


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

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

更改用户 test06 的密码 。

passwd:所有的身份验证令牌已经成功更新。



要使其不显示信息


/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

test06创建成功

test06密码设置成功


  

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


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


      变量名=变化的值


  使用变量:    $变量名



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

  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

请输入您要创建的帐号:kobe

请输入您要设置的密码:248

kobe创建成功

kobe密码设置成功


-------------------------------------------------------------------------------------------

什么是变量

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

– 变量名=变量值

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

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



设置变量时的注意事项

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

– 等号两边不要有空格

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

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



基本格式

– 引用变量值:$变量名

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




变量的种类


位置变量

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

$加数字($1、$2、$3.....):脚本文件名后面带有参数的默认变量

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

 #!/bin/bash

 echo $1

 echo $2

 echo $3

 echo ${10}         #显示超过两位数的值要加{} 

 echo ${11}     

 echo $21           #不加{}则显示前一位的值再加后一位的值


[[email protected] ~]# /root/2.sh haha  benniu  xixi  hehe   lele   dc  tc   dz   tz 100 200


haha

benniu

xixi

100                    #显示第十个值为100

200                    #显示第十个值为200

benniu1       #显示第二个值加个1为benniu1



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

  #!/bin/bash

  cat -n $1  |  head -$2       



[[email protected] ~]# /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表示正常,其他值异常




[[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

1

2

3

10

11

21

11                         #显示已加载的位置变量的个数为11

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

2017-11-07 


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

[[email protected] opt]# ls

2017-11-07  mydir-2017-11-07


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

[[email protected] opt]# ls

2017-11-07  MariaDB-2017-11-07  mydir-2017-11-07


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

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


[[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 

hello


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

hi



请书写一个脚本:

   用户输入一个IP地址(read),判断是否可以与该IP地址通信,能通则输出 "IP ok"   否则 输出 "IP no"


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


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

请输入一个IP地址:127.0.0.1

127.0.0.1 ok


[[email protected] ~]# /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以下          在牛的肖邦,也弹不出哥忧伤





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





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


[[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      #表示脚本文件后位置变量的个数为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‘

 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





[[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脚本学习

2018-4-17 Linux学习笔记

linux shell 学习脚本笔记

Linux学习笔记——Linux_shell脚本基础