zoukankan      html  css  js  c++  java
  • 【第二章】Shell 变量

    一、什么是变量?

    1. 变量就是一个固定的字符串(也可以是字符、数字的组合)代替更多、更复杂的内容,该内容可能是变量、路径、字符串等其他内容。
    2. 变量就是程序中保存用户数据的一块内存空间,而变量名就是这块内存空间的地址。
    3. 变量的值是在计算机的内存中,所以计算机重启后变量值就会丢失。需要长久保存的数据,应写入磁盘,避免存储在变量中。

    变量名:变量名可以由字母、数字、或者下划线组成,变量名区分大小写,大小写不同的两个变量名代表不同变量。

    二、变量的作用域?

    变量可以分为两类:环境变量(全局变量)和自定义变量(局部变量),环境变量可以称为全局变量,自定义变量可以称为局部变量。

      1、全局变量(等价于环境变量)

    • 在shell脚本中,全局变量可以在脚本中定义,或者在某个函数中定义。
    • 在脚本中定义的变量都是全局变量,其作用域为从被定义的地方开始,到shell脚本结束或者被显式的删除

    实例一:在脚本中定义的变量为全局变量,不仅在脚本中可以使用,还可以在函数内部使用。

    #!/bin/bash
    定义函数
    func()
    {
        echo "$v1" #输出全局变量v1的值
        v1=200      #修改全局变量的值
    }
    v1=100     #全局变量
    func
    echo "$v1"
    [root@host-131 ~]# sh Var01.sh 
    100
    200

    实例二:在shell中,默认情况下,函数内部定义的变量也属于全局变量。

    #!/bin/bash
    #定义一个变量
    func()
    {
        var1=100
    }
    func
    echo "$var1"
    [root@host-131 ~]# sh Var02.sh 
    100

    2、局部变量(等价于自定义变量)

    • 在shell语言中,可以在函数内部通过local关键字定义局部变量,另外函数的参数也是局部变量。

    实例一:由于函数内部使用了local 关键字,显式的定义了局部变量,所以再函数外部不能获得该变量

    #!/bin/bash
    #定义一个函数
    func()
    { 
        local v1=100
    }           
    func       
    echo "$v1"
    ~
    
      [root@host-131 ~]# sh Var3.sh    #执行结果为空        

    实例二、如果函数外部定义的全局变量和函数内部的局部变量同名,函数内部的局部变量会优先被使用。下例中尽管修改函数内部变量值v1,但只影响了局部变量v1,函数外部输出依然是全局变量v1。

    #!/bin/bash
    #定义一个函数
    v1=300
    func()
    {   
    echo "$v1" local v1
    =100 echo "$v1" } func echo "$v1"

    [root@host-131 ~]# sh Var3.sh

    300
    100
    300

    三、变量的类型?

    变量可分为两类:环境变量(全局变量)和自定义变量(局部变量)。

    两者的区别:环境变量可以在其进程的子进程中继续有效,自定义变量的实力范围则无法延伸到其进程的子进程中。

    1、显示变量的命令:

    • env :显示当前用户的环境变量,但不会显示其自定义变量
    • export : 功能同env一样,也是显示当前用户的环境变量,只不过该命令的输出是按变量名进行排序。
    • declare : 显示当前shell中定义的所有变量,包括用户的环境变量和自定义变量,该命令的输出按照变量名进行排序
    • set :功能同declare一样,显示当前shell中定义的所有变量,包括用户的环境变量和自定义变量。

    结论:

    env export 显示的是环境变量

    set declare 显示的是环境变量和自定义变量。

    四、简述变量的类型?

     1、 自定义变量

    定义变量: 变量名=变量值 变量名必须以字母或下划线开头,区分大小写 ip1=192.168.2.115
    引用变量: $变量名 或 ${变量名}
    查看变量: echo $变量名 set(所有变量:包括自定义变量和环境变量)
    取消变量: unset 变量名
    作用范围: 仅在当前shell中有效

    2、环境变量

    定义环境变量: 方法一 export back_dir2=/home/backup
            方法二 export back_dir1 将自定义变量转换成环境变量
    引用环境变量: $变量名 或 ${变量名}
    查看环境变量: echo $变量名 env 例如env |grep back_dir2
    取消环境变量: unset 变量名
    变量作用范围: 在当前shell和子shell有效
    =======================================================
    C语言        局部变量 vs 全局变量
    SHELL  自定义变量 vs 环境变量
    =======================================================

    3、位置变量
    $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10}

    4、预定义变量
    $0 脚本名
    $* 所有的参数
    $@ 所有的参数
    $# 参数的个数
    $$ 当前进程的PID
    $! 上一个后台进程的PID
    $? 上一个命令的返回值 0表示成功 

    五、变量的赋值、清除、引用、替换

    1、变量的赋值

    1.1 显式赋值
      变量名=变量值
      示例:

    v1=Linux
    v2='RedHat Linux'
    v3="Redhat $v1"
    v4=123245

    1.2 read 从键盘读入变量值

        read 变量名
        read -p "提示信息: "  变量名     #-p 选项用来显示提示语
        read -t 5 -p "提示信息: "  变量名 #-t 可以设置一个倾听的时间
        read -n 2 变量名
    read -s -p "提示信息: " 变量名 #-s 选项,它可以实现用户输入的时候,屏幕上不显示任何信息

    例1:显示提示语,和隐藏输入

    #!/bin/bash
    read -p "please input your name:" name
    echo "welcome !!!! $name"
    
    read -s -p "please input your Age:" age
    echo "your age is $age"
    exit 0

    :1、如果输入的变量数量少于变量的个数,那么多余的变量不会获取到数据,即变量为空

      2、如果输入的变量输多余变量的个数,那么超出的数据将都赋给最后一个变量

     例2:测试输入的ip是否通

    [root@host-131 ~]# cat var06.sh 
    #!/bin/bash
    read -p "Input ip:" ip
    ping -c 2 $ip &>/dev/null
    if [ $? -eq 0 ] ;then
        echo "This $ip is ok"
    else
        echo "This $ip is fail"
    fi
    [root@host-131 ~]# chmod a+x var06.sh 
    [root@host-131 ~]# ./var06.sh 
    Input ip:192.168.1.131          
    This 192.168.1.131 is ok
    [root@host-131 ~]# 

    2、清除变量

    当某个变量不用的时候我们可以清除,当变量清除后,其代表的值也会消失。

    实例一:清除变量

    [root@host-131 ~]# cat Var04.sh
    #!/bin/bash
    v1="Hello World"
    echo "$v1"
    unset v1
    echo "变量已清除"
    echo "$v1"
    
    [root@host-131 ~]# ./Var04.sh 
    Hello World
    变量已清除

    3、变量的引用

    shell中,一共有4种引用符号:

     

    4、命令替换

    在bash中命令替换有两种语法

    1、反引号 `shell_command`

    2、圆括号 $(shell_command)

    [root@host-131 ~]# v1="`pwd`"
    [root@host-131 ~]# echo $v1
    /root
    [root@host-131 ~]# v2=$(pwd)
    [root@host-131 ~]# echo $v2
    /root

    5、转义

    转换某些字符的特殊意义:

    [root@host-131 ~]# echo $SHELL
    /bin/bash
    [root@host-131 ~]# echo  $SHELL
    $SHELL
    [root@host-131 ~]# 
  • 相关阅读:
    CodeForces Gym 100500A A. Poetry Challenge DFS
    CDOJ 486 Good Morning 傻逼题
    CDOJ 483 Data Structure Problem DFS
    CDOJ 482 Charitable Exchange bfs
    CDOJ 481 Apparent Magnitude 水题
    Codeforces Gym 100637G G. #TheDress 暴力
    Gym 100637F F. The Pool for Lucky Ones 暴力
    Codeforces Gym 100637B B. Lunch 找规律
    Codeforces Gym 100637A A. Nano alarm-clocks 前缀和
    TC SRM 663 div2 B AABB 逆推
  • 原文地址:https://www.cnblogs.com/yangleitao/p/9168563.html
Copyright © 2011-2022 走看看