尚观培训-3.变量和引用

什么是变量

顾名思义,变量就是程序设计语言中的一个可以变化的量,当然,可以变化的是变量的值。变量几乎所有的程序设计语言中都有定义,并且其涵义也大同小异。从本质上讲,变量就是在程序中保存用户数据的一块内存空间,而变量名就是这块内存空间的地址。
在程序的执行过程中,保存数据的内存空间的内容可能会不断地发生变化,但是,代表内存地址的变量名却保持不变。

变量的命名

在Shell中,变量名可以由字母、数字或者下划线组成,并且只能以字母或者下划线开头。对于变量名的长度,Shell并没有做出明确的规定。因此,用户可以使用任意长度的字符串来作为变量名。但是,为了提高程序的可读性,建议用户使用相对较短的字符串作为变量名。
在一个设计良好的程序中,变量的命名有着非常大的学问。通常情况下,用户应该尽可能选择有明确意义的英文单词作为变量名,尽量避免使用拼音或者毫无意义的字符串作为变量名。这样的话,用户通过变量名就可以了解该变量的作用。
例如,下面的变量名都是非常好的选择:

PATH=/sbin
UID=100
JAVA_HOME="/usr/lib/jvm/jre-1.6.0-openjdk.x86_64/bin/../.."
SSHD=/usr/sbin/sshd

变量的类型

Shell是一种动态类型语言和弱类型语言,即在Shell中,变量的数据类型毋需显示地声明,变量的数据类型会根据不同的操作有所变化。准确地讲,Shell中的变量是不分数据类型的,统一地按照字符串存储。但是根据变量的上下文环境,允许程序执行一些不同的操作,例如字符串的比较和整数的加减等等。

演示Shell变量的数据类型
#!/bin/bash

#定义变量x,并且赋值为123
x=123
#变量x加1
let "x += 1"
#输出变量x的值
echo "x = $x"
#显示空行
Echo
#替换x中的1为abc,并且将值赋给变量y
y=${x/1/abc}
#输出变量y的值
echo "y = $y"
#声明变量y
declare -i y
#输出变量y的值
echo "y = $y"
#变量y的值加1
let "y += 1"
#输出变量y的值
echo "y = $y"
#显示空行
echo
#将字符串赋给变量z
z=abc22
#输出变量z的值
echo "z = $z"
#替换变量z中的abc为数字11,并且将值赋给变量m
m=${z/abc/11}
#输出变量m的值
echo "m = $m"
#变量m加1
let "m += 1"
#输出变量m的值
echo "m = $m"
echo
#将空串赋给变量n
n=""
#输出变量n的值
echo "n = $n"
#变量n加1
let "n += 1"
echo "n = $n"
echo
#输出空变量p的值
echo "p = $p"
# 变量p加1
let "p += 1"
echo "p = $p"

变量的定义

在Shell中,通常情况下用户可以直接使用变量,而毋需先进行定义,当用户第一次使用某个变量名时,实际上就同时定义了这个变量,在变量的作用域内,用户都可以使用该变量。

演示通过直接使用变量来定义变量
#!/bin/bash   

#定义变量a     
a=1            
#定义变量b     
b="hello"      
#定义变量c     
c="hello world"
通过declare命令声明变量
declare attribute variable
declare -i k=0

-p:显示所有变量的值。
-i:将变量定义为整数。在之后就可以直接对表达式求值,结果只能是整数。如果求值失败或者不是整数,就设置为0。
-r:将变量声明为只读变量。只读变量不允许修改,也不允许删除。
-a:变量声明为数组变量。但这没有必要。所有变量都不必显式定义就可以用作数组。事实上,在某种意义上,似乎所有变量都是数组,而且赋值给没有下标的变量与赋值给下标为0的数组元素相同.
-f:显示所有自定义函数,包括名称和函数体。
-x:将变量设置成环境变量,这样在随后的脚本和程序中可以使用。

演示使用不同的方法了声明变量,导致变量在不同的环境下表现出不同的行为
#!/bin/bash

定义变量x,并将一个算术式赋给它
x=6/3
echo "$x"
#定义变量x为整数
declare -i x
echo "$x"
#将算术式赋给变量x
x=6/3
echo "$x"
#将字符串赋给变量x
x=hello
echo "$x"
#将浮点数赋给变量x
x=3.14
echo "$x"
#取消变量x的整数属性
declare +i x
#重新将算术式赋给变量x
x=6/3
echo "$x"
#求表达式的值
x=$[6/3]
echo "$x"
#求表达式的值
x=$((6/3))
echo "$x"
#声明只读变量x
declare -r x
echo "$x"
#尝试为只读变量赋值
x=5
echo "$x

变量和引号

Shell语言中一共有3种引号,分别为
单引号(’ ‘)单引号括起来的字符都作为普通字符出现
双引号(” “)双引号括起来的字符,除“$”、“\”、“’”和“””这几个字符仍是特殊字符并保留其特殊功能外,其余字符仍作为普通字符对待,
反引号()。反引号括起来的字串被Shell解释为命令,在执行时,Shell首先执行该命令,并以它的标准输出结果取代整个反引号(包括两个反引号)部分
在第一篇文章中有介绍

变量的作用域

1.全局变量

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

演示全局变量的使用方法
#!/bin/bash

#定义函数
func()
{
   #输出变量x的值
   echo "$v1"
   #修改变量x的值
   v1=200
}
#在脚本中定义变量x
v1=100
#调用函数
func
#输出变量x的值
echo "$v1"
[root@localhost chapter3]# ./ex3-5.sh 
100
200
演示在函数内部定义全局变量的方法
#!/bin/bash

#定义函数
func()
{
   #在函数内部定义变量
   v2=200
}
#调用函数
func
#输出变量的值
echo "$v2"
[root@localhost chapter3]# ./ex3-6.sh 
200
局部变量

与全局变量相比,局部变量的使用范围较小,通常仅限于某个程序段访问,例如函数内部。在Shell语言中,可以在函数内部通过local关键字定义局部变量,另外,函数的参数也是局部变量。

演示使用local关键字定义局部变量
#!/bin/bash

#定义函数
func()
{
   #使用local关键字定义局部变量
   local v2=200
}
#调用函数
func
#输出变量的值
echo "$v2"
[root@localhost chapter3]# ./ex3-7.sh 
演示全局变量和局部变量的区别
#!/bin/bash

#定义函数
func()
{
   #输出全局变量v1的值
   echo "global variable v1 is $v1"
   #定义局部变量v1
   local v1=2
   #输出局部变量v1的值
   echo "local variable v1 is $v1"
}
#定义全局变量v1
v1=1
#调用函数
func
#输出全局变量v1的值
echo "global variable v1 is $v1"
[root@localhost chapter3]# ./ex3-8.sh 
global variable v1 is 1
local variable is 2
global variable is 1

#系统变量

Shell语言的系统变量主要在对参数判断和命令返回值判断时使用,包括脚本和函数的参数以及脚本和函数的返回值
这里写图片描述

演示常用系统变量的使用方法
#!/bin/bash

#输出脚本的参数个数
echo "the number of parameters is $#"
#输出上一个命令的退出状态码
echo "the return code of last command is $?"
#输出当前脚本名称
echo "the script name is $0"
#输出所有的参数
echo "the parameters are $*"
#输出其中的几个参数
echo "\$1=$1;\$2=$2;\$11=$11"
[root@localhost chapter3]# ./ex3-9.sh a b c d e f g h i j k l m n
the number of parameters is 14
the return code of last command is 0
the script name is ./ex3-9.sh
the parameters are a b c d e f g h i j k l m n
$1=a;$2=b;$11=a1
环境变量

Shell的环境变量是所有的Shell程序都可以使用的变量。Shell程序在运行时,都会接收一组变量,这组变量就是环境变量。环境变量会影响到所有的脚本的执行结果。
这里写图片描述

除了上表列出的环境变量之外,用户还可以使用set命令列出当前系统的环境变量。

[root@localhost chapter3]# set | more
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="1" [2]="2" [3]="1" [4]="release" [5]="x86_64-redhat-linux-gnu")
BASH_VERSION='4.1.2(1)-release'
COLORS=/etc/DIR_COLORS
COLUMNS=235
…
通过环境变量来获取与当前Shell有关的一些环境变量的值
#!/bin/bash

#输出命令搜索路径
echo "commands path is $PATH"
#输出当前的登录名
echo "current login name is $LOGNAME"
#输出当前用户的主目录
echo "current user's home is $HOME"
#输出当前的Shell
echo "current shell is $SHELL"
#输出当前工作目录
echo "current path is $PWD"
[root@localhost chapter3]# ./ex3-10.sh 
commands path is /usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/pgsql-9.2/bin
current login name is root
current user's home is /root
current shell is /bin/bash
current path is /root/chapter3

变量的赋值和清空

变量赋值

在Shell中,变量的赋值使用以下语法:
variable_name=value
其中,varibale_name表示变量名,value表示变量的值。

例如,下面都是有效的赋值语句:
v1=Linux
v2='RedHat Linux'
v3="RedHat Linux $HOSTTYPE"
v4=12345
引用变量的值

在Shell中,通过在变量名前面加上“$”,来获取该变量的值。

演示Shell变量的引用方法
#!/bin/bash

v1=Linux
v2='RedHat Linux'
v3="RedHat Linux $HOSTTYPE"
v4=12345
#输出变量v1的值
echo "$v1"
#输出变量
echo "$v2"
#输出变量v3的值
echo "$v3"
#输出变量v4的值
echo "$v4"
[root@localhost chapter3]# ./ex3-11.sh 
Linux
RedHat Linux
RedHat Linux x86_64
12345
清除变量

当Shell变量不再需要时,使用unset语句可以将其清除。当变量被清除后,其所代表的值也会消失。基本语法如下:
unset variable_name
其中,参数varibale_name表示要清除的变量的名称。

演示Shell变量清除方法,并且观察在清除前后变量值的变化
#!/bin/bash

#定义变量v1
v1="Hello world"
#输出v1的值
echo "$v1"
#清除变量
unset v1
echo "the value of v1 has been reset"
#再次输出变量的值
echo "$v1"
[root@localhost chapter3]# ./ex3-12.sh
Hello world
the value of v1 has been reset

引用和替换

变量的引用和替换是Shell对于变量功能的扩展。

引用

引用,是指将字符串用引用符号包括起来,以防止其中的特殊字符被Shell解释为其他涵义。特殊字符是指除了字面意思之外还可以解释为其他意思的字符。例如在Shell中,“ ASCII36 ” 符 号 的 本 身 涵 义 是 美 元 符 号 , 其 A S C I I 码 值 为 十 进 制 36 。 除 了 这 个 涵 义 之 外 , 前 面 已 经 讲 过 , “ ”符号还可以用了获取某个变量的值,即变量替换。星号“*”也是一个特殊的字符,星号可以用来作为通配符使用。

演示星号通配符的使用方法

这里写图片描述
这里写图片描述

全引用

演示全引用的方法

#!/bin/bash

#定义变量v1
v1=“value"
#输出含有变量名的字符串
echo 'Hello, $v1'
[root@localhost chapter3]# ./ex3-14.sh 
Hello, $v1
部分引用

对于单引号来说, 被其引用起来的所有的字符都将被解释为字面意义。而对于双引号来说,情况会有所不同。如果用户使用双引号将字符串引用起来,则其中所包含的字符除美元符号($)、反引号()以及反斜线(\)之外的所有的其他的字符,都将被解释为字面意义,这称为部分引用。也就是说,在部分引用中,“$”、“”和“\”仍然拥有特殊的涵义。

演示部分引用的方法
#!/bin/bash

#定义变量
v1=“world"
#输出变量的值
echo "Hello, $v1"
[root@localhost chapter3]# ./ex3-15.sh
Hello,world
命令替换

所谓命令替换,是指在Shell程序中,将某个Shell命令的执行结果赋给某个变量。在bash中,有2种语法可以进行命令替换,分别使用反引号和圆括号,如下:
command
$(command)
以上2种语法时等价的,用户可以根据自己的习惯来选择使用。

演示反引号的用法
#!/bin/bash

#变量替换
v1=`pwd`
#输出变量的值
echo "current working directory is $v1"
[root@localhost chapter3]# ./ex3-16.sh 
current working directory is /root/chapter3
转义

转义的作用是转换某些特殊字符的意义。转义使用反斜线表示,当反斜线后面的一个字符具有特殊的意义时,反斜线将屏蔽该字符的特殊意义,使得Shell按照该字符的字面意义来解释。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值