11# Bash 变量
22
3- 变量是某个内存区域的标签,通过变量名,可以读取该内存区域储存的信息。你也可以把变量简单理解成一个变动的值。
4-
53Shell 变量分成全局变量和局部变量两类。全局变量可以在所有 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 $1 00.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 $1 00.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
77119Bash 没有数据类型的概念,所有的变量值都是字符串。
78120
79- ` unset ` 命令用来删除一个变量。
80-
81- ``` bash
82- unset NAME
83- ```
84-
85121下面是一些自定义变量的例子。
86122
87123``` bash
@@ -93,6 +129,16 @@ e=$(ls -l foo.txt) # 变量值可以是命令的执行结果
93129f=$(( 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 $1 00.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 $1 00.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
176182Bash 还提供一些特殊变量。这些变量的值由 Shell 提供,用户不能进行赋值。
177183
184+ (1)` $? `
185+
178186` $? ` 为上一个命令的退出码,用来判断上一个命令是否执行成功。
179187
180188``` bash
@@ -185,13 +193,17 @@ $ echo $?
1851931
186194```
187195
196+ (2)` $$ `
197+
188198` $$ ` 为当前 Shell 的进程 ID。
189199
190200``` bash
191201$ echo $$
19220210662
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 $!
21222611064
213227```
214228
215- ` $0 ` 为当前 Shell 的名称或者脚本名。
229+ (5)` $0 `
230+
231+ ` $0 ` 为当前 Shell 的名称(命令行直接执行)或者脚本名(脚本中执行)。
216232
217233``` bash
218- echo $0
234+ $ echo $0
219235bash
220236```
221237
238+ (6)` $- `
239+
222240` $- ` 为当前 Shell 的启动参数。
223241
224242``` bash
225243$ echo $-
226244himBHs
227245```
228246
229- 另外,特殊变量还有` $@ ` 和` $# ` ,与脚本的参数数量有关,参见脚本一章。
247+ (7)` $@ ` 和` $# `
248+
249+ 特殊变量还有` $@ ` 和` $# ` ,与脚本的参数数量有关,参见脚本一章。
230250
231251## 空变量的默认值
232252
0 commit comments