Shell-变量和引用-深入认识变量
Posted 天津 唐秙
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell-变量和引用-深入认识变量相关的知识,希望对你有一定的参考价值。
1. 深入认识变量
1.1 变量的命名
在shell中,变量名可以由字母、数字或者下划线组成,并且只能以字母或者下划线开头,用户应该尽可能选择有明确意义的英文单词作为变量名,尽量避免使用拼音或者毫无意义的字符串作为命名。注意,在shell中,变量命名的大小写是敏感的,大小写不同的两个变量名并不代表同一个变量。
1.2 变量的类型
根据变量类型确定时间可以将程序设计语言分为两类,分别是静态类型和动态类型语言。其中,静态类型语言是在程序的编译期间就确定变量类型的语言,例如Java、C++,在这些语言中使用变量时,必须首先声明其类型。动态设计语言是在程序的执行过程中才确定的数据类型的语言,例如VBScript、php、Python等。在这些语言中,变量的类型根据第一次赋给该变量的值得数据类型来确定。
根据是否强制要求类型定义,可以将程序设计语言分为强类型语言和弱类型语言。强类型语言要求用户在定义变量时必须明确指定其数据类型,例如java和C++。在强类型语言中,数据类型之间的转换非常重要。弱类型语言则不要求用户明确指定变量的数据类型,例如VBScript。用户可以将任意类型的数值赋给该变量,变量的数据类型之间的转换也无需明确进行。
shell是一种动态类型语言和弱类型语言,即在shell中,变量的数据类型无需显示地声明,变量的数据类型会根据不同的操作有所变化,准确的说,shell中的变量是不分数据类型的,统一的按照字符串存储,但是根据变量的上下文环境,允许程序执行一些不同的操作,例如字符串的比较和整数的加减等。
1.3 变量的定义
在shell中,通常情况下用户可以直接使用变量,无需先进行定义,当用户第一次使用某个变量名时,实际上就同时定义了这个变量。如果变量的值中包括空格,则一定要使用引号引起来。
bash提供declare的命令来声明变量
declare attribute variable
其中,attribute表示变量的属性,常用属性如下:
- -p:显示所有变量的值
- -i:将变量定义为整数
- -r:将变量声明为只读变量
- -a:变量声明为数组变量
- -f:显示所有自定义函数,包括函数名和函数体
- -x:将变量设置成环境变量
参数variable表示变量名称。
例子1
#! /bin/bash
x=6/3
echo "$x"
#定义变量x为整数
declare -i x
echo "$x"
#将算数式赋给变量x
x=6/3
echo "$x"
注意切记不能写成x = 6/3,中间如果加上了空格,系统就会默认认为x是一个命令,所以系统找不到这个命令,就会报如下错误
1.4 变量和引号
shell中一共3种引号,单引号、双引号和反引号,单引号括起来的字符都作为普通字符出现,由双引号括起来的字符,除“$”,“\\”,“’”和“"”这几个字符仍是特殊字符并保留其特殊功能外,其余字符仍作为普通字符对待。由反引号引起来的字符被shell解释为命令,在执行时,shell首先执行该命令,并以它的标准输出结果取代整个反引号部分。
1.5 变量的作用域
shell中的变量也分为全局变量和局部变量两种。
1.5.1 全局变量
全局变量可以在脚本中定义,也可以在某个函数中定义,在脚本中定义的变量都是全局变量,其作用域为从被定义的地方开始,一直到shell脚本结束或者被显示地删除。除了脚本中定义全局变量之外,在函数内部定义的变量默认情况下也是全局变量,其作用域为从函数被调用时执行变量定义的地方开始,一直到shell脚本结束或者被显式地删除为止。
#! /bin/bash
fun()
{
v2=200
}
v2=100
echo "$v2"
fun
echo "$v2"
之所以能够得到200,是因为shell中,默认情况下,函数内部定义的变量也属于全局变量,因此,在fun中的变量v2在函数外部仍然可以使用。
1.5.1 局部变量
与全局变量相比,局部变量的使用范围较小,通常仅限于某个程序段访问,在函数内部通过local关键字定义局部变量,另外函数的参数也是局部变量。
#! /bin/bash
fun()
{
local v2=200;
}
fun
echo "$v2"
由于在函数的内部使用local,显式地定义了局部变量,所以在函数外面不能获得该函数的值,因此,输出仅仅为空值。如果用户在函数外面定义了一个全局变量,函数内部有一个相同名称的局部变量,则在调用该函数时,函数内部的局部变量会屏蔽函数外部定义的全局变量。
1.6 系统变量
shell语言的系统变量主要是对参数判断和命令返回值判断时使用的,包括脚本和函数参数,以及脚本和函数的返回值。
shell中常见的系统变量
变量 | 说明 |
---|---|
$n | n是一个整数,从1开始,表示参数的位置,例如$1表示第一个参数 |
$# | 命令行参数的个数 |
$0 | 当前shell脚本的名称 |
$? | 前一个命令或者函数的返回状态码 |
$* | 以“参数1 参数2 …”的形式将所有的参数通过一个字符串返回 |
$@ | 以“参数1”“参数2”…的形式返回每个参数 |
$$ | 返回本程序的进程ID(PID) |
注意:
1.在shell语言中,使用$n的形式获取位置参数时,shell通常的变量名只是一位数字,即1-9,如果是第11个参数的值时,需要用大括号把11括起来。
2.反斜线称为转义字符,用于将特殊字符转换为普通字符。
1.7 环境变量
shell的环境变量时所有shell程序都可以使用的变量,shell程序在运行的时候,都会接收一组变量,这组变量就是环境变量,环境变量会影响所有脚本的执行结果。
变量 | 说明 |
---|---|
PATH | 命令搜索路径,以冒号为分隔符。注意与window不同的是,当前目录不在系统路径里 |
HOME | 用户主目录的路径名,是cd命令的默认参数 |
COLUMNS | 定义了命令编辑模式下可使用命令行的长度 |
HISTFILE | 命令历史文件 |
HISTSIZE | 命令历史文件中最多包含的命令条数 |
HISTFILESIZE | 命令历史文件中包含的最大行数 |
IFS | 定义shell使用的分隔符 |
LOGNAME | 当前登录名 |
SHELL | shell的全路径名 |
TERM | 终端类型 |
TMOUT | shell自动退出的时间,单位秒,若设置为0,则禁止shell退出 |
PWD | 当前工作路径 |
以上是关于Shell-变量和引用-深入认识变量的主要内容,如果未能解决你的问题,请参考以下文章