Skip to content

Commit a326f87

Browse files
committed
docs: edit varibles
1 parent fa3fd05 commit a326f87

1 file changed

Lines changed: 73 additions & 53 deletions

File tree

docs/variable.md

Lines changed: 73 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
# Bash 变量
22

3-
变量是某个内存区域的标签,通过变量名,可以读取该内存区域储存的信息。你也可以把变量简单理解成一个变动的值。
4-
53
Shell 变量分成全局变量和局部变量两类。全局变量可以在所有 Shell 中访问,局部变量仅在当前 Shell 中可用。
64

75
## 全局变量
@@ -32,24 +30,68 @@ $ printenv
3230

3331
这些环境变量很少发生变化,一般可以视为常量。由于它们的变量名全部都是大写,所以传统上,如果用户要自己定义一个常量,也会使用全部大写的变量名。
3432

33+
注意,Bash 变量名区分大小写,HOME 和 home 是两个不同的变量。
34+
3535
查看单个环境变量的值,可以使用`printenv`命令或`echo`命令。
3636

3737
```bash
3838
$ printenv PATH
3939
# 或者
40-
$ ench $PATH
40+
$ echo $PATH
4141
```
4242

4343
注意,`printenv`命令后面的变量名,不用加前缀`$`
4444

4545
## 局部变量
4646

47-
局部变量是仅在当前 Shell 可用的变量,一旦退出,就不存在了。`set`命令可以显示所有变量(包括全局变量)和函数。
47+
局部变量是仅在当前 Shell 可用的变量,一旦退出,就不存在了。
48+
49+
`set`命令可以显示所有变量(包括全局变量)和函数。
4850

4951
```bash
5052
$ set
5153
```
5254

55+
## 读取变量
56+
57+
读取变量的时候,直接在变量名前加上`$`就可以了。
58+
59+
```bash
60+
$ foo=bar
61+
$ echo $foo
62+
bar
63+
```
64+
65+
每当 Shell 看到以`$`开头的单词时,就会尝试读取这个变量名对应的值。
66+
67+
由于`$`在 Bash 中有特殊含义,使用时一定要小心,
68+
69+
```bash
70+
$ echo The total is $100.00
71+
The total is 00.00
72+
```
73+
74+
上面命令的原意是输入`$100`,但是 Bash 将`$1`解释成了变量,该变量为空,因此输入就变成了`00.00`
75+
76+
所以,如果要使用`$`的原义,需要在`$`前面放上反斜杠,进行转义。
77+
78+
```bash
79+
$ echo The total is \$100.00
80+
The total is $100.00
81+
```
82+
83+
读取变量的时候,变量名可以被花括号`{}`包围,比如`$a`可以用`${a}`表示,这样可以用于一些特殊情况,防止变量名的混淆。
84+
85+
```bash
86+
$ a=foo
87+
$ echo $a_file
88+
89+
$ echo ${a}_file
90+
foo_file
91+
```
92+
93+
上面代码中,变量名`a_file`不会有任何输出,因为 Bash 将其整个解释为变量,而这个变量是不存在的。只有用花括号区分`$a`,将其替换为`foo`,才能正确显示。
94+
5395
## 创建变量
5496

5597
用户创建变量的时候,一般约定,全局变量的变量名都使用大写字母,局部变量使用小写字母。
@@ -76,12 +118,6 @@ myvar="hello world"
76118

77119
Bash 没有数据类型的概念,所有的变量值都是字符串。
78120

79-
`unset`命令用来删除一个变量。
80-
81-
```bash
82-
unset NAME
83-
```
84-
85121
下面是一些自定义变量的例子。
86122

87123
```bash
@@ -93,6 +129,16 @@ e=$(ls -l foo.txt) # 变量值可以是命令的执行结果
93129
f=$((5 * 7)) # 变量值可以是数学运算的结果
94130
```
95131

132+
## 删除变量
133+
134+
`unset`命令用来删除一个变量。
135+
136+
```bash
137+
unset NAME
138+
```
139+
140+
这个命令不是很有用。因为不存在的 Bash 变量一律都等于空字符串,所以即使`unset`命令删除了变量,还是可以读取这个变量,值为空字符串。
141+
96142
## 输出变量
97143

98144
像上一节那样创建的变量,都是局部变量,仅可用于当前 Shell,当前 Shell 的子进程读取不到此变量。为了把变量传递到子 Shell,需要使用`export`命令。这样输出的变量,对于子 Shell 来说就是环境变量。
@@ -131,50 +177,12 @@ bar
131177

132178
上面例子,子 Shell 修改了继承的变量`$foo`,对父 Shell 没有影响。
133179

134-
## 变量的读取
135-
136-
读取变量的时候,直接在变量名前加上`$`就可以了。
137-
138-
```bash
139-
$ foo=bar
140-
$ echo $foo
141-
bar
142-
```
143-
144-
每当 Shell 看到以`$`开头的单词时,就会尝试读取这个变量名对应的值。
145-
146-
由于`$`在 Bash 中有特殊含义,使用时一定要小心,
147-
148-
```bash
149-
$ echo The total is $100.00
150-
The total is 00.00
151-
```
152-
153-
上面命令的原意是输入`$100`,但是 Bash 将`$1`解释成了变量,该变量为空,因此输入就变成了`00.00`
154-
155-
所以,如果要使用`$`的原义,需要在`$`前面放上反斜杠,进行转义。
156-
157-
```bash
158-
$ echo The total is \$100.00
159-
The total is $100.00
160-
```
161-
162-
读取变量的时候,变量名可以被花括号`{}`包围,比如`$a`可以用`${a}`表示,这样可以用于一些特殊情况,防止变量名的混淆。
163-
164-
```bash
165-
$ a=foo
166-
$ echo $a_file
167-
168-
$ echo ${a}_file
169-
foo_file
170-
```
171-
172-
上面代码中,变量名`a_file`不会有任何输出,因为 Bash 将其整个解释为变量,而这个变量是不存在的。只有用花括号区分`$a`,将其替换为`foo`,才能正确显示。
173-
174180
## 特殊变量
175181

176182
Bash 还提供一些特殊变量。这些变量的值由 Shell 提供,用户不能进行赋值。
177183

184+
(1)`$?`
185+
178186
`$?`为上一个命令的退出码,用来判断上一个命令是否执行成功。
179187

180188
```bash
@@ -185,13 +193,17 @@ $ echo $?
185193
1
186194
```
187195

196+
(2)`$$`
197+
188198
`$$`为当前 Shell 的进程 ID。
189199

190200
```bash
191201
$ echo $$
192202
10662
193203
```
194204

205+
(3)`$_`
206+
195207
`$_`为上一个命令的最后一个参数。
196208

197209
```bash
@@ -202,6 +214,8 @@ $ echo $_
202214
/usr/share/dict/words
203215
```
204216

217+
(4)`$!`
218+
205219
`$!`为最近一个后台执行的异步命令的进程 ID。
206220

207221
```bash
@@ -212,21 +226,27 @@ $ echo $!
212226
11064
213227
```
214228

215-
`$0`为当前 Shell 的名称或者脚本名。
229+
(5)`$0`
230+
231+
`$0`为当前 Shell 的名称(命令行直接执行)或者脚本名(脚本中执行)。
216232

217233
```bash
218-
echo $0
234+
$ echo $0
219235
bash
220236
```
221237

238+
(6)`$-`
239+
222240
`$-`为当前 Shell 的启动参数。
223241

224242
```bash
225243
$ echo $-
226244
himBHs
227245
```
228246

229-
另外,特殊变量还有`$@``$#`,与脚本的参数数量有关,参见脚本一章。
247+
(7)`$@``$#`
248+
249+
特殊变量还有`$@``$#`,与脚本的参数数量有关,参见脚本一章。
230250

231251
## 空变量的默认值
232252

0 commit comments

Comments
 (0)