目录
变量定义
变量是任何一种编程语言都必不可少的,变量用来存放和指代各种数据。脚本语言的变量通常不需要指定数据类型,直接赋值就可以。
变量定义时,不需要加美元符号($),如:my_name="Crystal"
变量命名需要遵循以下规则:
- 变量名和等号(也叫赋值符号)之间不能有空格;
- 变量名只能使用英文字母,数字和下划线,首个字符不能以数字开头,中间不能使用空格;
- 变量名不能使用bash中的关键字。
附上变量名示例:
变量赋值和使用
1. 变量赋值
先上示例,新建测试文件test2.sh,文件内容及脚本执行结果如下:
![变量赋值](https://img-blog.csdnimg.cn/20190301172022578.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1NjA2MTc1,size_16,color_FFFFFF,t_70)
shell支持三种赋值方式:
-
variable=value
-
variable='value'
-
variable="value"
variable 是变量名,value 是赋给变量的值。如果 value 不包含任何空白符(例如空格、Tab 缩进等),那么可以不使用引号;如果 value 包含了空白符,那么就必须使用引号包围起来。
使用单引号和使用双引号也是有区别的,通过下图的示例,我们来看看单引号和双引号的赋值有什么区别:
从上面的执行结果可以得出结论:
单引号赋值的特点:
- 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
- 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用,示例如下:
双引号赋值的特点:
- 双引号里可以有变量
- 双引号里可以出现转义字符
关于变量赋值,提出一下几点建议:
- 变量的内容是数字,可以不加引号;
- 需要原样输出,使用单引号赋值;
- 其他没有特别要求的字符串等最好都加上双引号,定义变量时加双引号是最常见的使用场景。
2. 变量使用
使用变量时需要在变量名前加美元符号?,变量名外的花括号是可选的,但是建议加上花括号,可以帮助解释器有效的识别变量边界,示例如下:
从上面的图片可以看到,给变量加花括号后可以保证正确的输出结果。使用变量应该加上花括号{ },这是个良好的编程习惯。
3. 变量值修改
已定义的变量,可以被重新赋值,如下所示:
4. 将命令的结果赋值给变量
shell支持将命令的执行结果赋值给变量,有一下两种赋值方式:
-
val=`command` 注意,这里的符号不是单引号,是反引号,esc按键下方的符号
-
val=$(command) 使用符号$()将赋值内容圈起来,更容易理解
其中,val 是变量名,command 是要输出的命令。
例如,我将test.sh文件中的内容使用cat命令读取出来,然后复制给一个变量,使用echo输出,执行效果如下所示:
从上面的执行结果可以看出,test.sh文件中是有换行的,但是输出内容却以一行显示,那么如何才能让test.sh文件中的内容格式不混乱呢?接着看下面的输出,找找看有什么细微的差异:
所以,为了防止出现格式混乱的情况,尽量在使用变量时用双引号将其包围起来。
总结:
- 一般情况下,两种变量的替换效果是等价的,可以任意使用,但是由于反引号看起来像是单引号,容易造成误解,不易读,使用$()更容易理解;
- $() 支持嵌套,反引号不支持;
- $() 仅在bash shell中有效,反引号可以在多种shell中使用。
变量的作用域
shell变量的作用域就是shell变量的有效范围,shell变量的作用域可以分为三种:
- 仅在当前shell实例中有效,其他shell启动的程序不能访问的变量,这叫做全局变量(global variable);
- 有的变量只能在函数内部使用,这叫做局部变量(local variable);
- 所有的程序,包括shell启动的程序,都能访问的变量,这叫做环境变量(environment variable)。