Linux——shell 脚本入门基础知识 到 实战☆☆☆☆(变量、判断、循环、数组和函数、三剑客)

本文目录

第一章 变量

1.前言

2.自定义变量

3. 整数运算

4. 小数运算

5.环境变量

5.1 位置变量

5.2 预定义变量

第二章 判断

1. shell 条件测试

1.1 数值比较

1.2 文件测试

1.3 字符串比较

1.4 and 和 or

2.流程控制:if

2.1 单分支结构

2.2 双分支结构

2.2 多分支结构

2.3 嵌套结构

2.4 调试脚本

2.5. 总结(注意)

3.模拟匹配:case

3.1 前言

3.2 案例1:简单的模式匹配

3.3 案例2:简单的Jump server

第三章 循环

1. shell循环:for

1.1 语法结构

1.2 案例1 :ping测试主机

1.3 案例2:通过用户列表文件创建用户

1.4 案例3:使用for实现批量主机root密码的修改

2. Shell循环:while until

2.1 while 语法结构

2.2 until 语法结构

3.3 退出程序或者循环的三种方式

3. expect

3.1语法结构

3.2 示例1:通过expect解决ssh交互问题

3.3 示例2:expect实战:公钥推送

第四章 数组和函数

1. 数组

1.1 简介

1.2 类型

1.3 普通数组

1.4 关联数组

1.5 数组和循环的案例1

1.6 数组和循环的案例2

2. 函数               

2.1 概述

2.2 案列1:定义数组和应用数组

2.3 案列2:利用传参把数据应用到函数里

2.4 案列3:阶乘概念

2.5 案列4:数组传参,函数结果再赋予数组

3. 影响shell程序的内置命令

3.1 概述

3.2 shift 案列

第五章 三剑客

1. 正则表达式

1.1 名词解释

1.2 案例

1.3 元字符

2. grep

3. sed

3.1 前言

3.2 格式

3.3 返回值

3.4 sed和正则表达式

3.5 汇总示例 重点

  4. awk

4.1 前言

4.2 工作原理

4.3 语法

4.4 内部变量

4.5 格式化输出

4.6 模式(正则表达)和动作

4.7 awk脚本编程

4.7.3 循环

4.7.4 数组

4.7.5 awk编程案例


第一章 变量

1.前言

什么是shell ==> shell,壳,命令解释器,一种应用程序。

shell变量? 用一个固定的字符串去表示不固定的内容,便于修改。

2.自定义变量

  • 定义变量:只需执行 “变量名=变量值” 命令即可,要遵守变量定义规则,

                         例如:#name="xielei666"

  • 变量调用:定义变量name:#name="xielei666"

                         输出变量name的值:#echo_$name

  • 重复定义变量:

   ①重复定义变量会进行覆盖,例如#aa=123,再aa=456,最后查询 echo=$aa,结果会显     示456 

   ②重复定义变量aa的值是原aa的值加上456,可以这样做:aa="$aa"456 或者             aa=${aa}456

  • 变量查看: 已知变量名可通过echo来查询变量值,如果不知变量名,可通过 #set命令 来查询系统中已经存在的变量
  • 变量删除:#unset_aa ,aa代表变量名,unset中文复位

  •  变量示例:①使用变量前:

                           编写测试主机在线的脚本,在线时提示在线,不在线时提示不在线。

                          编写脚本如下:       

vim ping.sh
#!/bin/bash
ping -c1 192.168.145.227 &> /dev/null && echo 192.168.145.227up || echo 192.168.145.227down
#c1指ping的次数,&>指输出到,/dev/null指垃圾桶,&& echo 192.168.145.227up 指前面的命令成功了会提示这一句,|| echo 192.168.145.227own指前面的命令失败了会提示这一句      

                        ②使用变量后:

                         编写测试主机在线的脚本,在线时提示在线,不在线时提示不在线。

                         编写脚本如下:

vim ping1.sh
#!/bin/bash
ip=192.168.145.227
ping -c1 $ip &> /dev/null && echo "$ip"up || echo ${ip}down
  • 交互定义变量:read从键值读入变量值,赋值方式:read 变量名

示例:

vim ping2.sh
#!/bin/bash
read -p "请输入您需要测试的第1个IP: " ip1     # "请输入您需要测试的第1个IP: "这个是显示给客户看的内容
read -p "请输入您需要测试的第2个IP:" ip2
ping -c1 $ip1 &> /dev/null && echo "$ip1"up || echo ${ip1} down
ping -c1 $ip2 &> /dev/null && echo "$ip2"up || echo ${ip2} down  

3. 整数运算

①方法1:expr

语法:
#expr 1 + 2
#expr $numl + $num2
案列:需求是运算学员的总分
vim sum.sh
#!/bin/bash
read -p "请输入您的第一门成绩: " number1
read -p "请输入您的第二门成绩: " number2
echo -n "总成绩为: " 
expr $number1 + $number2

②方法2:$(( ))

语法:
echo $((2**3))  #指2的3次方
echo $((num1+num2))
echo $((2+2))

③方法3:$[ ]

语法:
echo $[5+2]
echo $[5**2]

④方法4:let(运算)

示例:
let sum=2+3;echo $sum
let i++;echo $i  #这个方法一般是用来计数的

4. 小数运算

请提前安装计算器程序 bc

示例:
echo "2+4" | bc
echo "scale=2; 10/3" | bc   # scale=2指小数位为2位

5.环境变量

5.1 位置变量

命令  参数1 参数2 参数3 ...... 以后特殊定义

           $1      $2       $3    ......

示例:需求:制作脚本,用户自动输入两门学科成绩,自动算出平均分

vim avg.sh
#!/bin/bash
echo "($1+$2)/2" | bc

再测试脚本
# bash avg.sh 50 60 

这里执行脚本命令后面跟的两个参数,分别是 $1 和 $2

5.2 预定义变量

语法: 
$0   脚本名/程序名
$*   所有的参数
$#   参数的个数   # 有变量的话,就要这样写${#file} ,file指变量名
示例:
vim avg1.sh
#!/bin/bash
echo "($1+$2)/2" | bc
echo "该程序名为$0"
echo "该程序使用了$#个参数"
echo "该程序使用了以下参数(所有参数)$*"
$? 上一个程序的返回值(0是成功,非零即失败)
$$ 程序的PID (可以区分进程,父子进程)

第二章 判断

1. shell 条件测试

===数值比较 [ 整数1 操作符 整数2 ]

===文件测试 [ 操作符 文件或目录 ]

===字符串比较 [ “字符串” = “字符串1” ]

and 和 or

1.1 数值比较

格式:[ 整数1 操作符 整数2 ]

①操作符:

  • [ 20 -gt 10 ] 大于  
  • [ 1 -lt 10 ] 小于
  • [ 1 -eq 1 ] 等于
  • [ 1 -ne 10 ] 不等于
  • [ 20 -ge 10 ] 大于等于
  • [ 10 -le 10 ] 小于等于

左边数值:客户输入值      右边数值:自定义值

②示例

需求:猜测用户输入的密码,是否满足长度需求

脚本:

Linux——shell 脚本入门基础知识 到 实战☆☆☆☆(变量、判断、循环、数组和函数、三剑客)_第1张图片

vim  pass.sh           #输入以下内容:
#!/bin/bash           #脚本声明                                    
read  -p  "请输入您的密码:  "      pass   
if    [  ${#pass}    -lt  7   ]                       
then   echo   "您的密码太短(输入正确)"  #then意思是if命令返回值0,则显示该命令                  
else   echo  "您的密码太长"        #else意思是if命令返回值是1,则显示该命令                 
fi             #结束

1.2 文件测试

格式:[ 操作符 文件或目录 ]

①操作符

-f

file

当file存在时返回真

-b

file

当file存在并且是个文件时返回真(返回0)

-d

pathname

当由pathname存在并且是一个目录时返回真

-e

pathname

当由pathname指定的文件或目录存在时返回真

-w

pathname

当由pathname指定的文件或目录存在并且可写时返回真

-x

pathname

当由pathname指定的文件或目录存在并且可执行时返回真

-p filename

当filename存在并且是命名管道时返回真

                 .............

②示例

需求:请用户输入备份的目录,

如果目录存在提示已存在可以备份,如果不存在设置新建目录,并提示创建成功可以备份。

脚本:

vim  path.sh      #输入以下内容
#!/bin/bash
read   -p   “请输入要备份的目录”   path     #path是变量名
if  [    -d    $path   ]      # -p是操作符,[]是测试语法
then    echo   "$path存在且可以备份"
else    echo  "$path不存在不能备份"
mkdir  "$path"
echo  "$path目录已创建,可以备份"
fi

最后,利用bash 执行该变量验证结果

bash  path.sh 

1.3 字符串比较

格式:[ “字符串” = “字符串1” ]

①操作符:

= , 等于                          -z , 判断字符长度是为0 (了解)

!= ,不等于                    -n , 判断字符长度不是为0 (了解)

②示例:

需求:邀请用户确认,yes升级装备,no不升级装备

脚本:

vim  select.sh     
#!/bin/bash     
read -p "您确认要升级这件装配吗?[yes/no] "   select   
if  [ "$select" = "yes" ]   # 两个双引号最好加上,保证不报错
then  echo "装配开始升级"
else  echo "感谢您,欢迎下次光临"
fi

如果条件测试想设为不等于就加上 ,比如

if  [ "$select" != "yes" ]   # != 为不等于 

1.4 and 和 or

①简介

当条件测试比较复杂时,需要多个条件同时成立。就需要混合条件测试了。

逻辑的(and)和(or):

&&  逻辑的 and 的意思,         -a , 两个条件同时成立,为真

 ||    逻辑的 or 的意思,            -o ,两个条件一个成立,为真

②示例:

需求:猜测用户输入的密码是否满足如下条件

1.长度大于7位

2.包含字母大写

3.包含字母小写

4.包含符号“ @ _ ! ”

脚本:

vim user.sh
#!/bin/bash
read -p "请输入您的密码: "   pass
if [ ${#pass} -gt 7 ] && [[ ${pass} =~ [a-z] ]] && [[ ${pass} =~ [A-Z] ]] &&  [[ ${pass} =~ [@_!] ]]  #使用特殊符号~(指区间)时就要加双括号 
    then 
          echo "yes"
    else
          echo "no" 
fi

如果使用逻辑中的or ,也就是 || ,那么其中的要求只要满足一个即可

vim user.sh
#!/bin/bash
read -p "请输入您的密码: "   pass
if [ ${#pass} -gt 7 ] || [[ ${pass} =~ [a-z] ]] || [[ ${pass} =~ [A-Z] ]] || [[ ${pass} =~ [@_!] ]] 
    then 
          echo "yes"
    else
          echo "no" 
fi

2.流程控制:if

2.1 单分支结构

语法:

if [ command/test ] ; then

      符合该条件执行的语句

fi

2.2 双分支结构

语法:

 
  

你可能感兴趣的:(linux,运维,服务器)