博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【第二章】Shell 变量
阅读量:4920 次
发布时间:2019-06-11

本文共 3627 字,大约阅读时间需要 12 分钟。

一、什么是变量?

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

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

二、变量的作用域?

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

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

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

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

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

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

#!/bin/bash#定义一个变量func(){    var1=100}funcecho "$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=300func(){       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=Linuxv2='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/bashread -p "please input your name:" nameecho "welcome !!!! $name"read -s -p "please input your Age:" ageecho "your age is $age"exit 0

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

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

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

[root@host-131 ~]# cat var06.sh #!/bin/bashread -p "Input ip:" ipping -c 2 $ip &>/dev/nullif [ $? -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/bashv1="Hello World"echo "$v1"unset v1echo "变量已清除"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 ~]#

 

转载于:https://www.cnblogs.com/yangleitao/p/9168563.html

你可能感兴趣的文章
missing python bz2 module
查看>>
CUDA:Supercomputing for the Masses (用于大量数据的超级计算)-第十节
查看>>
单个单选框radio 点击选中点击取消选中
查看>>
团队冲刺随笔合集—Beta阶段
查看>>
Android ANR的产生与分析
查看>>
大型网站架构
查看>>
Appium+python自动化29-appium对博客园APP进行自动化测试
查看>>
cocos2d实例-移动精灵
查看>>
SQL Server 2005 导出包含(insert into)数据的SQL脚本 (使用存储过程)
查看>>
Python控制键盘鼠标:pynput,mouse,keyboard
查看>>
这里的*号实际表示就是RAC中所有实例都使用
查看>>
在python中编写socket服务端模块(二):使用poll或epoll
查看>>
解决Synergy的鼠标无法从服务器(server)机屏幕移动到客户机(client)屏幕的问题
查看>>
第三代搜索推出网民评价系统,seo末日还会远吗?
查看>>
希尔排序
查看>>
Silverlight 1.1架构图
查看>>
企业架构 - ADM方法概要介绍
查看>>
需求:如何做好深度访谈
查看>>
领域实体框架Rafy2 发布了
查看>>
CreateRemoteThread的调试问题
查看>>