SHELL编程-变量定义

主要学习点

  • Shell的基本语法结构
    如:变量定义、条件判断、循环语句(for、until、while)、分支语句、函数和数组等;
  • 基本正则表达式的运用;
  • 文件处理三剑客:grep、sed、awk工具的使用;
  • 使用shell脚本完成一些较复杂的任务,如:服务搭建、批量处理等。
1.SHELL基础
1.1SHELL概念

shell就是人机交互的一个桥梁
shell的种类

[root@MissHou ~]# cat /etc/shells 
/bin/sh				#是bash的一个快捷方式
/bin/bash			#bash是大多数Linux默认的shell,包含的功能几乎可以涵盖shell所有	的功能
/sbin/nologin		#表示非交互,不能登录操作系统
/bin/dash			#小巧,高效,功能相比少一些
/bin/csh				#具有C语言风格的一种shell,具有许多特性,但也有一些缺陷
/bin/tcsh			#是csh的增强版,完全兼容csh
1.2SHELL脚本

将需要执行的命令保存到文本中,按照顺序执行。它是解释型的,意味着不需要编译。
若干命令 + 脚本的基本格式 + 脚本特定语法 + 思想= shell脚本

1.3什么时候用到脚本?

重复化、复杂化的工作,通过把工作的命令写成脚本,以后仅仅需要执行脚本就能完成这些工作。

1.4shell脚本能干啥?
  • 自动化软件部署 LAMP/LNMP/Tomcat…
  • 自动化管理 系统初始化脚本、批量更改主机密码、推送公钥…
  • 自动化分析处理 统计网站访问量
  • 自动化备份 数据库备份、日志转储…
  • 自动化监控脚本
1.5shell脚本的基本写法
  • 脚本第一行,魔法字符==#!==指定解释器【必写】

    #!/bin/bash 表示以下内容使用bash解释器解析
    
  • -x:一般用于排错,查看脚本的执行过程
    -n:用来查看脚本的语法是否有问题

2.变量的定义
2.1变量定义
[root@MissHou ~]# A=hello			定义变量A
[root@MissHou ~]# echo $A			调用变量A    hello
[root@MissHou ~]# echo ${A}		    还可以这样调用   hello
[root@MissHou ~]# A=world			变量可以变
[root@MissHou ~]# echo $A			world
[root@MissHou ~]# unset A		    重置变量
[root@MissHou ~]# echo $A			空
2.2变量的定义规则
  • 变量名区分大小写

  • 变量名不能有特殊符号

  • 变量名不能以数字开头

  • 等号两边不能有任何空格

  • 变量名尽量做到见名知意

    2.3变量的定义方式
  • 2.3.1直接赋值给一个变量
     	[root@MissHou ~]# A=1234567
    	[root@MissHou ~]# echo $A
    	1234567
    	[root@MissHou ~]# echo ${A:2:4}		表示从A变量中第3个字符开始截取,截取4个字符
    	3456
    说明:
    **$变量名 和 ${变量名}的异同**
    
    相同点:都可以调用变量
    
    不同点:`${变量名}`可以只截取变量的一部分,而`$变量名`不可以
    
    • 2.3.2命令执行结果赋值给变量
      [root@MissHou ~]# B=`date +%F`
      [root@MissHou ~]# echo $B
      2019-04-16
      [root@MissHou ~]# C=$(uname -r)
      [root@MissHou ~]# echo $C
      2.6.32-696.el6.x86_64
      
    • 2.3.3交互式定义变量(read)
      • 目的:让用户自己给变量赋值,比较灵活。

      • 语法:read [选项] 变量名

      • 常见选项:

          -p定义提示用户的信息  
          -n	定义字符数(限制变量值的长度)
          -s	不显示(不显示用户输入的内容)
          -t	定义超时时间,默认单位为秒(限制用户输入变量值的超时时间)
        
      • 举例说明:

        用法1:用户自己定义变量值

          [root@MissHou ~]# read name   //提示用户定义一个name,并输入值
          harry
          [root@MissHou ~]# echo $name
          harry
          [root@MissHou ~]# read -p "Input your name:" name
          Input your name:tom
          [root@MissHou ~]# echo $name
          tom
        

        用法2:变量值来自文件

          [root@MissHou ~]# cat 1.txt 
          10.1.1.1 255.255.255.0
          
          [root@MissHou ~]# read ip mask < 1.txt 
          [root@MissHou ~]# echo $ip
          10.1.1.1
          [root@MissHou ~]# echo $mask
          255.255.255.0
        
    • 2.3.4定义有类型的变量(declare)
      • 目的: 给变量做一些限制,固定变量的类型,比如:整型、只读

      • 用法:declare 选项 变量名=变量值

      • 常用选项:

        -i	将变量看成整数	declare -i A=123
        -r	定义只读变量	declare -r B=hello
        -a	定义普通数组;查看普通数组	
        -A	定义关联数组;查看关联数组	
        -x	将变量通过环境导出	declare -x AAA=123456 等于 export AAA=123456
        
      • 举例说明:

        [root@MissHou ~]# declare -i A=123
        [root@MissHou ~]# echo $A
        123
        [root@MissHou ~]# A=hello
        [root@MissHou ~]# echo $A
        0
        
        [root@MissHou ~]# declare -r B=hello
        [root@MissHou ~]# echo $B
        hello
        [root@MissHou ~]# B=world
        -bash: B: readonly variable
        [root@MissHou ~]# unset B
        -bash: unset: B: cannot unset: readonly variable
        
  • 2.4变量的分类
    2.4.1本地变量

    本地变量:当前用户自定义的变量。当前进程中有效,其他进程及当前进程的子进程无效。

    2.4.2环境变量

    环境变量:当前进程有效,并且能够被子进程调用。

    • env查看当前用户的环境变量
    • set查询当前用户的所有变量(临时变量与环境变量)
    • export 变量名=变量值 或者 变量名=变量值;export 变量名
    2.4.3全局变量
    • 全局变量:全局所有的用户和程序都能调用,且继承,新建的用户也默认能调用.
    • 解读相关配置文件
文件名说明备注
$HOME/.bashrc当前用户的bash信息,用户登录时读取定义别名、umask、函数等
$HOME/.bash_profile当前用户的环境变量,用户登录时读取
$HOME/.bash_logout当前用户退出当前shell时最后读取定义用户退出时执行的程序等
/etc/bashrc全局的bash信息,所有用户都生效
/etc/profile全局环境变量信息系统和所有用户都生效
$HOME/.bash_history用户的历史命令history -w 保存历史记录 history -c 清空历史记录
  • 说明 :以上文件修改后,都需要重新source让其生效或者退出重新登录。

  • 用户登录系统读取相关文件的顺序

      /etc/profile
      $HOME/.bash_profile
      $HOME/.bashrc
      /etc/bashrc
      $HOME/.bash_logout
    
    2.4.4系统变量

    系统变量(内置bash中变量) : shell本身已经固定好了它的名字和作用.

内置变量含义
$?上一条命令执行后返回的状态;状态值为0表示执行正常,非0表示执行异常或错误
$0当前执行的程序或脚本名
$#脚本后面接的参数的个数
$*脚本后面所有参数,参数当成一个整体输出,每一个变量参数之间以空格隔开
$@脚本后面所有参数,参数是独立的,也是全部输出
$1~$9脚本后面的位置参数,$1表示第1个位置参数,依次类推
10   {10}~ 10 {n}扩展位置参数,第10个位置变量必须用{}大括号括起来(2位数字
$$当前所在进程的进程号,如echo $$
$!后台运行的最后一个进程号 (当前终端)
!$调用最后一条命令历史中的参数
3.简单四则运算

算术运算:默认情况下,shell就只能支持简单的整数运算

运算内容:加(+)、减(-)、乘(*)、除(/)、求余数(%)

  • 3.1四则运算符号
表达式举例
$(( ))echo $((1+1))
$[ ]echo $[10-5]
exprexpr 10 / 5
letn=1;let n+=1 等价于 let n=n+1
4.数组
  • 4.1数组分类

    普通数组:只能使用整数作为数组索引(元素的下标)
    关联数组:可以使用字符串作为数组索引(元素的下标)

    4.1.1普通数组定义
    • 一次赋予一个值

        数组名[索引下标]=值
        array[0]=v1
        array[1]=v2
        array[2]=v3
        array[3]=v4
      
    • 一次赋予多个值

        数组名=(值1 值2 值3 ...)
        array=(var1 var2 var3 var4)
        
        array1=(`cat /etc/passwd`)			将文件中每一行赋值给array1数组
        array2=(`ls /root`)
        array3=(harry amy jack "Miss Hou")
        array4=(1 2 3 4 "hello world" [10]=linux)
      
    4.1.2数组的读取
     ${数组名[元素下标]}
    
     echo ${array[0]}			获取数组里第一个元素
     echo ${array[*]}			获取数组里的所有元素
     echo ${#array[*]}			获取数组里所有元素个数
     echo ${!array[@]}    	获取数组元素的索引下标
     echo ${array[@]:1:2}    访问指定的元素;1代表从下标为1的元素开始获取;2代表获取后面几个元素
     
     查看普通数组信息:
     [root@MissHou ~]# declare -a
    
4.2.1普通数组定义
  • 首先声明关联数组

       declare -A asso_array1
    
  • 数组赋值

    • 一次赋一个值
      数组名[索引or下标]=变量值

      数组名[索引or下标]=变量值
      # asso_array1[linux]=one
      # asso_array1[java]=two
      # asso_array1[php]=three
      
    • 一次赋多个值

      # asso_array2=([name1]=harry [name2]=jack [name3]=amy [name4]="Miss Hou")
      
    • 查看关联数组

      # declare -A
      declare -A asso_array1='([php]="three" [java]="two" [linux]="one" )'
      declare -A asso_array2='([name3]="amy" [name2]="jack" [name1]="harry" [name4]="Miss Hou" )'
      
    • 获取关联数组值

      # echo ${asso_array1[linux]}
      one
      # echo ${asso_array1[php]}
      three
      # echo ${asso_array1[*]}
      three two one
      # echo ${!asso_array1[*]}
      php java linux
      # echo ${#asso_array1[*]}
      3
      # echo ${#asso_array2[*]}
      4
      # echo ${!asso_array2[*]}
      name3 name2 name1 name4
      
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值