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
变量名外面的花括号是可选的, 加不加都行, 加花括号是为了帮助解释器识别变量的边界.
注解
建议给所有变量加上花括号, 这是一个好的编程习惯.
单引号和双引号的区别¶
定义变量时, 变量的值可以用单引号''包围, 也可以用双引号""包围, 它们到底有什么区别呢?
- 以单引号包围的字符串是原始字符串(所见即所得), 单引号里面是什么就输出什么, 即使内容中有变量和命令也会把它们原样输出.
- 以双引号包围的字符串, 输出时会先解析里面的变量和命令, 而不是把双引号中的变量名和命令原样输出.
注解
- 如果变量的内容是数字, 那么可以不加引号;
- 如果需要原样输出就加单引号;
- 其它没有特别要求的字符串等最好都加上双引号, 定义变量时加双引号是最常见的使用场景.
将命令的结果赋值给变量¶
Shell支持将命令的执行结果赋值给变量, 常见的有以下两种方式:
variable=`command`
variable=$(command)
第一种方式把命令用反单引号``包围起来, 反单引号和单引号非常相似, 容易产生混淆, 所以不推荐使用这种方式;
第二种方式把命令$() 包围起来, 区分更加明显, 所以推荐使用这种方式.
只读变量¶
使用readonly可以将变量定义为只读的.
- 可以在定义变量的同时将其声明为
readonly的;
readonly name="hello"
- 也可以先定义变量, 再将其声明为
readonly的.
name="hello"
readonly name