什么是变量

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

变量的命名

在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"#定义局部变量v1local 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中,“ ”符号的本身涵义是美元符号,其ASCII码值为十进制36。除了这个涵义之外,前面已经讲过,“ ” 符 号 的 本 身 涵 义 是 美 元 符 号 , 其 A S C I I 码 值 为 十 进 制 36 。 除 了 这 个 涵 义 之 外 , 前 面 已 经 讲 过 , “ ”符号的本身涵义是美元符号,其ASCII码值为十进制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按照该字符的字面意义来解释。

尚观培训-3.变量和引用相关推荐

  1. 尚观python培训_尚观Python基础入门学习,资源教程下载

    课程名称 尚观Python基础入门学习,资源教程下载 课程介绍 Python开发是目前很多朋友选择学习的一门技术,在大家学习的同时,楼主在这里给大家分享了一个运维python视频教程,需要的朋友可以下 ...

  2. JAVA培训注重趣味引导 尚观推出免费体验活动

    目前,IT职业培训在国内可谓如火如荼,就业.高薪.定向委培等推广手段竞相出台,让人看得眼花缭乱.面对众多培训机构,学员和家长显得不知如何选择,一片茫然. 据一位正准备选择IT培训机构的学生讲,他非常希 ...

  3. 尚观科技java培训 - 笔记学习体系大纲

    第一次: 1.安装 VNC-5.3.0-Windows 与讲师屏幕视频一致. 2.尚观整个学习体系大纲 ①java语言  语法 排序  数据结构  面向对象  继承封装多态借口 多线程 3个项目  数 ...

  4. 尚观linux视频配套教程,尚观最新嵌入式Linux基础视频教程 98集嵌入式Linux巨制视频教程 新手必备...

    尚观最新嵌入式Linux基础视频教程 98集嵌入式Linux巨制视频教程 新手必备 5.jpg (67.09 KB, 下载次数: 0) 2018-4-16 09:34 上传 1.jpg (44.17 ...

  5. 尚观Linux最佳入门高清视频教程033/133/253

    [高清]Linux 最佳入门ULE112- RHCE033部分高清视频教程[尚观原创] 视频简介:高清RHCE033部分是RHCE考试中的基础部分,同时也是我们Linux入门的必 备学习资料.想学好L ...

  6. 【尚观】Android游戏与应用开发最佳学习之路_转载来学习Android

    Android游戏与应用开发最佳学习路线图 为了帮助大家更好的学习Android,并快速入门特此我们为大家制定了以下学习路线图,希望能够帮助大家. 一.      路线图概括: 开博不到一周,不予上传 ...

  7. c语言指针尚观嵌入式,C语言-指针

    本文目录 •直接引用 •一.什么是指针? •二.指针的定义 •三.指针的初始化 •四.指针运算符 •五.指针的用途举例 •六.关于指针的疑问 指针是C语言中非常重要的数据类型,如果你说C语言中除了指针 ...

  8. final修饰的变量是引用不能改变还是引用的对象不能改变

    我们都知道final修饰变量时 会变为常量,但是使 用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变? 下面让我们来看这段代码: [java] view plain copy /* ...

  9. go 指针变量和普通变量的转化_7.8 C++指针变量的引用

    点击上方"C语言入门到精通",选择置顶 第一时间关注程序猿身边的故事 作者 闫小林 白天搬砖,晚上做梦.我有故事,你有酒么? C++指针变量的引用 在C++中有两个与指针变量有关的 ...

最新文章

  1. css 横线_CSS-画一个太极阴阳图
  2. html5 video css样式修改,htmlvideo标签用法
  3. 视频回顾 | 微信生态数字化运营进阶课大全!
  4. ubuntu18.04下安装tomcat8.5
  5. Python将JSON格式数据转换为SQL语句以便导入MySQL数据库
  6. GitHub上值得收藏的100个精选前端项目!
  7. 接口协作--apipost接口协作工具
  8. win11应用商店怎么联网 Windows11应用商店无法联网的解决步骤
  9. 4个常用的计算机应用软件,信息技术应用--常用计算机工具软件4常用工具软件单元四.pdf...
  10. SPSS、 Mplus下载安装包
  11. Flex StringUtil工具类
  12. 阿里云ICON全部下载
  13. JAVA:项目文档及编写目的汇总
  14. 计算机组成与原理第二章,计算机组成原理《第二章》
  15. 如何用pdfFactory新建打印机并设置属性
  16. 一个错误例子带你深入理解数据库“自联接”查询
  17. jboss启动oracle表不存在,JBoss的部署及运行
  18. 计算机报名照片最小像素高宽,网上报名照片如何确定大小
  19. 文秘与计算机的知识,18文秘02李荧 随着现代科学技术的发展,计算机已经
  20. glide默认的缓存图片路径地址_Glide图片硬盘缓存使用详解

热门文章

  1. 空天地一体化网络运营方法分析与挑战
  2. ARM汇编实现二维卷积/图像卷积(汇编语言)
  3. 学习:GridView中asp:BoundField的Visible=false时,无法取到这个字段的值
  4. 线上化解决素质教育机构5大痛点
  5. 诺基亚安卓手机_诺粉 | 诺基亚手机可升级安卓 11 机型列表曝光
  6. 【无标题】多语种平行语料数据,助力“一带一路”深入交流
  7. 理解前端的 Middleware 原理与实现
  8. 询问HTG:单向文件同步,缺少启动管理器以及iTunes与Android同步
  9. xunfeng(巡风)源码解读之vulscan
  10. 上海交通大学计算机专业课,上海交通大学计算机专业课138的经验_跨考网