Shell变量

变量是任何一种编程语言都必不可少的组成部分, 变量用来存放各种数据. 脚本语言在定义变量时通常不需要指明类型, 直接赋值即可, Shell变量也遵循这个原则.

在Bash shell中, 如果不特别指明, 每一个变量的值都是字符串, 无论你给变量赋值时有没有使用引号, 值都会以字符串的形式存储. 这意味着, Bash shell在默认情况下不会区分变量类型, 即使你将整数和小数赋值给变量, 它们也会被视为字符串, 这一点和大部分的编程语言不同.

当然, 如果有必要, 也可以使用declare关键字显式定义变量的类型, 但在一般情况下没有这个需求, Shell开发者在编写代码时自行注意值的类型即可.

定义变量

Shell支持以下三种定义变量的方式:

variable=value
variable='value'
variable="value"

variable是变量名, value是赋给变量的值. 如果value不包含任何空白字符(例如空格, Tab缩进等), 那么可以不使用引号; 如果value包含了空白字符, 那么就必须使用引号包围起来(使用单引号和双引号也是有区别的).

注意

给Shell变量赋值时, =两侧不能有空格, 这和大部分的编程语言不一样.

Shell变量的命名规范和大部分编程语言一样:

  • 变量名只能包含数字, 字母和下划线, 且不能以数字开头;
  • 不能使用Shell里的关键字(可以用help命令查看保留关键字).

使用变量

使用一个定义过的变量的值, 只要在变量名前加上$即可.

Example:

str="Hello, world"
echo $str

变量名外面的花括号是可选的, 加不加都行, 加花括号是为了帮助解释器识别变量的边界.

注解

建议给所有变量加上花括号, 这是一个好的编程习惯.

修改变量的值

已定义的变量, 可以重新赋值.

Example:

name="hello"
name="world"

对变量重新赋值时不能在变量名前加上$, 只有在使用变量的值时才需要家$.

单引号和双引号的区别

定义变量时, 变量的值可以用单引号''包围, 也可以用双引号""包围, 它们到底有什么区别呢?

  • 以单引号包围的字符串是原始字符串(所见即所得), 单引号里面是什么就输出什么, 即使内容中有变量和命令也会把它们原样输出.
  • 以双引号包围的字符串, 输出时会先解析里面的变量和命令, 而不是把双引号中的变量名和命令原样输出.

注解

  • 如果变量的内容是数字, 那么可以不加引号;
  • 如果需要原样输出就加单引号;
  • 其它没有特别要求的字符串等最好都加上双引号, 定义变量时加双引号是最常见的使用场景.

将命令的结果赋值给变量

Shell支持将命令的执行结果赋值给变量, 常见的有以下两种方式:

variable=`command`
variable=$(command)

第一种方式把命令用反单引号``包围起来, 反单引号和单引号非常相似, 容易产生混淆, 所以不推荐使用这种方式; 第二种方式把命令$() 包围起来, 区分更加明显, 所以推荐使用这种方式.

只读变量

使用readonly可以将变量定义为只读的.

  • 可以在定义变量的同时将其声明为readonly的;
readonly name="hello"
  • 也可以先定义变量, 再将其声明为readonly的.
name="hello"
readonly name

删除变量

使用unset命令可以删除变量, 其语法为:

unset variable_name

变量删除之后不能再次使用, unset命令不能删除只读变量.