### 部分概念
- 变量和值之间不能有空格
- 默认所有变量类型都是字符串 
- 变量名区分大小写
- 变量名不能含有特殊符号 & ? * #
-  变量名不能以数字开头
-  可以使用下划线开头
-  名字尽量做到见名知意

### 切片
- ${变量名:索引开始位置:切片长度}
- 切片长度可以超过变量实际长度
```
me@me-EQ59:~$ A=123456
me@me-EQ59:~$ echo $A
123456
me@me-EQ59:~$ echo ${A}
123456
me@me-EQ59:~$ echo ${A:2:4}
3456
me@me-EQ59:~$
```

### 命令的结果赋值给变量
- 反引号 包裹
```
me@me-EQ59:~$ A=`date +'%F %T'`
me@me-EQ59:~$ echo $A
2023-06-22 22:48:00
me@me-EQ59:~$
```
- $() 包裹
```
me@me-EQ59:~$ A=$(date +'%F %T')
me@me-EQ59:~$ echo $A
2023-06-22 22:49:25
me@me-EQ59:~$
```

### 交互式给变量赋值
- read 参数 变量名
```
me@me-EQ59:~$ read name
name
me@me-EQ59:~$ echo $name
name
me@me-EQ59:~$
```

- 输入提示
```
me@me-EQ59:~$ read -p "Input your name:" name
Input your name:tom
me@me-EQ59:~$ echo $name
tom
me@me-EQ59:~$
```

- 输入提示，隐藏用户输入内容
```
me@me-EQ59:~$ read -sp "Input your password:" pass
Input your password:me@me-EQ59:~$
me@me-EQ59:~$ echo $pass
123456
me@me-EQ59:~$
```

- 限制输入长度，超过长度后自动结束输入
```
me@me-EQ59:~$ read -n 5 -p "Input your name: " name
Input your name: zhangme@me-EQ59:~$ san
找不到命令 “san”，但有 16 个相似命令。
me@me-EQ59:~$ echo $name
zhang
me@me-EQ59:~$
```

- 限制用户输入超时时间，超过限制时间自动关闭输入
```
me@me-EQ59:~$ read -t 3 -p "Input your name:" name
Input your name:me@me-EQ59:~$
me@me-EQ59:~$ echo $name

me@me-EQ59:~$
```

### declare 定义限制变量
- https://www.runoob.com/linux/linux-comm-declare.html
- -i 整型，限定类型后不符合类型的值，会被设置为默认值
```
me@me-EQ59:~$ declare -i A=1234
me@me-EQ59:~$ echo $A
1234
me@me-EQ59:~$ A=hello
me@me-EQ59:~$ echo $A
0
me@me-EQ59:~$
```
- -r 只读变量，不能进行 unset 操作
- -x 设置环境变量

### 变量分类
- 本地变量，只在当前进程中有效
```
me@me-EQ59:~$ echo $A
0
me@me-EQ59:~$ bash
me@me-EQ59:~$ echo $A

me@me-EQ59:~$
```
- 环境变量，当前进程有效，并且能够被子进程调用
	- env 查询当前用户的环境变量
	- set 查询当前有的所有变量，包括环境变量和临时变量 
- 全局变量：全局所有的用户和程序都能调用，且继承，新建的用户也能默认调用
- 系统变量：shell 本身已经固定好的名字和作用
![8801a0e5453be03569f1ee0cf0adfda0.png](../../_resources/8801a0e5453be03569f1ee0cf0adfda0.png)
