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中常见的系统变量

变量说明
$nn是一个整数,从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当前登录名
SHELLshell的全路径名
TERM终端类型
TMOUTshell自动退出的时间,单位秒,若设置为0,则禁止shell退出
PWD当前工作路径

以上是关于Shell-变量和引用-深入认识变量的主要内容,如果未能解决你的问题,请参考以下文章

Bash的变量类型

认识批处理延迟变量扩展

3 primitive主数据类型和引用 认识变量

深入思考右值引用

在awk代码中引用shell变量的方法

跟着360架构师 学习Shell脚本编程 完整版