Skip to content

Commit fc778f0

Browse files
committed
docs: edit variable
1 parent e5f1fc6 commit fc778f0

6 files changed

Lines changed: 138 additions & 21 deletions

File tree

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
Bash 教程(正在撰写中)
1+
本教程介绍 Linux 命令行 Bash 的基本用法和脚本编程

docs/intro.md

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
Bash 是 Unix 系统和 Linux 系统的一种 Shell(命令行环境),是目前绝大多数 Linux 发行版的默认 Shell。
44

5-
## Shell 是什么
5+
## Shell 和 Bash
66

77
Shell 有多种含义。
88

@@ -14,7 +14,9 @@ Shell 有多种含义。
1414

1515
Shell 这个单词的原意是“外壳”,跟 kernel (内核)相对应,比喻内核外面的一层,即用户跟内核交互的对话界面。本书中,除非特别指明,Shell 指的就是命令行环境。
1616

17-
Shell 有很多种,只要能给用户提供命令行环境的程序,都可以看作是 Shell。历史上,主要的 Shell 有 Bourne Shell(缩写为`sh`)、Bourne Again shell(缩写为`bash`)、C Shell(缩写为`csh`)、TENEX C Shell(缩写为`tcsh`)、Korn shell(缩写为`ksh`)、Z Shell(缩写为`zsh`)、Friendly Interactive Shell(缩写为`fish`)。Bash 是目前最常用的 Shell,除非特别指明,下文的 Shell 和 Bash 当作同义词使用,可以互换。
17+
Shell 有很多种,只要能给用户提供命令行环境的程序,都可以看作是 Shell。历史上,主要的 Shell 有 Bourne Shell(缩写为`sh`)、Bourne Again shell(缩写为`bash`)、C Shell(缩写为`csh`)、TENEX C Shell(缩写为`tcsh`)、Korn shell(缩写为`ksh`)、Z Shell(缩写为`zsh`)、Friendly Interactive Shell(缩写为`fish`)。
18+
19+
Bash 是目前最常用的 Shell,除非特别指明,下文的 Shell 和 Bash 当作同义词使用,可以互换。
1820

1921
下面的命令可以查看当前运行的 Shell。
2022

@@ -33,7 +35,7 @@ $ cat /etc/shells
3335

3436
Linux 允许每个用户使用不同的 Shell,用户的默认 Shell 一般都是 Bash。
3537

36-
## 如何进入命令行环境
38+
## 命令行环境
3739

3840
如果是不带有图形环境的 Linux 系统,启动后就直接是命令行环境。
3941

@@ -200,15 +202,15 @@ keyword
200202
201203
## Bash 的快捷键
202204
203-
Bash 有以下快捷键,可以大大方便操作。
205+
Bash 提供很多快捷键,可以大大方便操作。下面的是一些最常用的,完整的介绍参见《行操作》一章
204206
205207
- `Ctrl + L`:清除屏幕并将当前行移到页面顶部。
206208
- `Ctrl + C`:中止当前正在执行的命令。
207209
- `Shift + PageUp`:向上滚动。
208210
- `Shift + PageDown`:向下滚动。
209211
- `Ctrl + U`:从光标位置删除到行首。
210212
- `Ctrl + K`:从光标位置删除到行尾。
211-
- `Ctrl + D`关闭shell会话
213+
- `Ctrl + D`关闭 Shell 会话
212214
- ````:浏览已执行命令的历史记录。
213215
214216
除了上面的快捷键,Bash 还具有自动补全功能。命令输入到一半的时候,可以按下 Tab 键,Bash 会自动完成剩下的部分。比如,输入`pw`,然后按一下 Tab 键,Bash 会自动补上`d`

docs/prompt.md

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,3 +110,38 @@ PS1='\[\033[0;31m\]<\u@\h \W>\$\[\033[00m\]'
110110
PS1='\[\033[0;41m\]<\u@\h \W>\$\[\033[0m\] '
111111
```
112112

113+
## 环境变量 PS2,PS3,PS4
114+
115+
除了`PS1`,Bash 还提供了提示符相关的另外三个环境变量。
116+
117+
环境变量`PS2`是命令行折行输入时系统的提示符,默认为`> `
118+
119+
```bash
120+
$ echo "hello
121+
> world"
122+
```
123+
124+
上面命令中,输入`hello`以后按下回车键,系统会提示继续输入。这时,第二行显示的提示符就是`PS2`定义的`> `
125+
126+
环境变量`PS3`是使用`select`命令时,系统输入菜单的提示符。
127+
128+
环境变量`PS4`默认为`+ `。它是使用 Bash 的`-x`参数执行脚本时,每一行命令在执行前都会先打印出来,并且在行首出现的那个提示符。
129+
130+
比如下面是脚本`test.sh`
131+
132+
```bash
133+
#!/bin/bash
134+
135+
echo "hello world"
136+
```
137+
138+
使用`-x`参数执行这个脚本。
139+
140+
```bash
141+
$ bash -x test.sh
142+
+ echo 'hello world'
143+
hello world
144+
```
145+
146+
上面例子中,输出的第一行前面有一个`+ `,这就是变量`PS4`定义的。
147+

docs/readline.md

Lines changed: 38 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,8 @@ Readline 提供了许多快捷键,用来快速地移动光标。默认的快
9898

9999
## 操作历史
100100

101+
### 基本用法
102+
101103
Bash 会保留用户的操作历史,即用户输入的每一条命令。退出当前 Shell 的时候,Bash 会将用户刚才的操作历史写入`~/.bash_history`文件,该文件默认储存500个操作。
102104

103105
环境变量`HISTFILE`总是指向这个文件。
@@ -107,6 +109,38 @@ $ echo $HISTFILE
107109
/home/me/.bash_history
108110
```
109111

112+
有了操作历史以后,就可以使用方向键的````,快速浏览上一条和下一条命令。下面的方法还可以快速执行以前执行过的命令。
113+
114+
```bash
115+
$ echo Hello World
116+
Hello World
117+
118+
$ echo Goodbye
119+
Goodbye
120+
121+
$ !e
122+
echo Goodbye
123+
Goodbye
124+
125+
$ !echo
126+
echo Goodbye
127+
Goodbye
128+
129+
$ !echo H
130+
echo Goodbye H
131+
Goodbye H
132+
133+
$ !echo H G
134+
echo Goodbye H G
135+
Goodbye H G
136+
```
137+
138+
上面例子中,`!e`表示找出操作历史之中,最近的那一条以`e`开头的命令并执行。Bash 会先输出那一条命令`echo Goodbye`,然后直接执行。同理,`!echo`也会执行最近一条以`echo`开头的命令。
139+
140+
注意,`!string`语法只会匹配命令,不会匹配参数。所以`!echo H`不会执行`echo Hello World`,而是会执行`echo Goobye`,并把参数`H`附加在这条命令之后。同理,`!echo H G`也是等同于`echo Goodbye`命令之后附件`H G`
141+
142+
最后,按下 Ctrl + r 会显示操作历史,可以用方向键上下移动,选择其中要执行的命令。也可以键入命令的首字母,Shell 就会自动在历史文件中,查询并显示匹配的结果。
143+
110144
### history 命令
111145

112146
`history`命令能显示操作历史,即`.bash_history`文件的内容。使用该命令,而不是直接读取`.bash_history`文件的好处是,它会在所有的操作前加上行号,最近的操作在最后面,行号最大。
@@ -126,6 +160,8 @@ $ history
126160

127161
上面代码中,`%F`相当于`%Y - %m - %d``%T`相当于` %H : %M : %S`
128162

163+
只要设置`HISTTIMEFORMAT`这个环境变量,就会保存命令的执行时间戳。如果不设置,就不会保存时间戳。
164+
129165
如果不希望保存本次操作的历史,可以设置环境变量`HISTSIZE`等于0。
130166

131167
```bash
@@ -142,19 +178,13 @@ $ history | grep /usr/bin
142178

143179
上面命令返回`.bash_history`文件里面,那些包含`/usr/bin`的命令。
144180

145-
还有一种更简便的搜索方式,就是按下`Ctrl - r`,然后每键入一个字符,Shell 就会自动在历史文件中,查询并显示匹配的结果。这时,上下移动选中想要执行的命令,按下回车键即可。
146-
147-
知道了命令的行号以后,可以用`感叹号 + 行号`执行该命令。如果想要执行`.bash_history`里面的第8个命令,可以像下面这样操作。
181+
操作历史的每一条记录都有编号。知道了命令的编号以后,可以用`感叹号 + 编号`执行该命令。如果想要执行`.bash_history`里面的第8条命令,可以像下面这样操作。
148182

149183
```bash
150184
$ !8
151185
```
152186

153-
上面的命令执行操作历史里面第8条命令。
154-
155-
`感叹号 + 搜索字符串`会执行最近一个符合条件的命令。比如,以前执行过`netstat -np | grep 22`,那么输入`!net`就会执行这条命令。
156-
157-
`-c`参数可以清除操作历史。
187+
`history`命令的`-c`参数可以清除操作历史。
158188

159189
```bash
160190
$ history -c

docs/script.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,16 @@ $ alias rm='rm -i'
282282

283283
上面命令指定`rm`命令是`rm -i`,每次删除文件之前,都会让用户确认。
284284

285+
`alias`定义的别名也可以接受参数,但命令直接接受参数的效果是一样的。
286+
287+
```bash
288+
$ alias echo='echo It says: '
289+
$ echo hello world
290+
It says: hello world
291+
```
292+
293+
上面例子中,别名定义了`echo`命令的前两个参数,等同于修改了`echo`命令的默认行为。
294+
285295
指定别名以后,就可以像使用其他命令一样使用别名。一般来说,都会把常用的别名写在`~/.bashrc`的末尾。另外,只能为命令定义别名,为其他部分(比如很长的路径)定义别名是无效的。
286296

287297
直接调用`alias`命令,可以显示所有别名。

docs/variable.md

Lines changed: 47 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -351,16 +351,23 @@ declare OPTION VARIABLE=value
351351
`declare`命令的主要参数(OPTION)如下。
352352

353353
- `-a`:声明数组变量。
354+
- `-f`:输出所有函数定义。
355+
- `-F`:输出所有函数名。
354356
- `-i`:声明整数变量。
357+
- `-l`:声明变量为小写字母。
358+
- `-p`:查看变量信息。
355359
- `-r`:声明只读变量。
356-
- `-x`:该变量通过环境变量输出。
357360
- `-u`:声明变量为大写字母。
358-
- `-l`:声明变量为小写字母。
359-
- `-f`:输出所有函数定义。
360-
- `-F`:输出所有函数名。
361+
- `-x`:该变量输出为环境变量。
361362

362363
`declare`命令如果用在函数中,声明的变量只在函数内部有效,等同于`local`命令。
363364

365+
不带任何参数,`declare`直接执行可以输出当前环境的所有变量,包括函数在内。
366+
367+
```bash
368+
$ declare
369+
```
370+
364371
**(1)`-i`参数**
365372

366373
`-i`参数声明整数变量以后,可以直接进行数学运算。
@@ -417,12 +424,24 @@ $ echo $bar
417424
lower
418425
```
419426

420-
**(6)不带参数使用**
427+
**(6)`-p`参数**
421428

422-
不带任何参数,`declare`直接执行可以输出当前环境的所有变量,包括函数在内
429+
`-p`参数输出变量信息
423430

424431
```bash
425-
$ declare
432+
$ foo=hello
433+
$ declare -p foo
434+
declare -- foo="hello"
435+
$ declare -p bar
436+
bar:未找到
437+
```
438+
439+
上面例子中,`declare -p`可以输出已定义变量的值,对于未定义的变量,会提出找不到。
440+
441+
如果不提供变量名,`declear -p`输出所有变量的信息。
442+
443+
```bash
444+
$ declare -p
426445
```
427446

428447
**(7)`-f`参数**
@@ -488,3 +507,24 @@ $ echo $v1,$v2
488507

489508
这种语法支持的运算符,参考《Bash 的算术运算》一章。
490509

510+
## 参数终止符 `--`
511+
512+
变量当作命令参数时,有时希望指定变量只能作为路径名,不能当作配置参数,这时可以使用参数终止符`--`
513+
514+
```bash
515+
$ myPath="~/docs"
516+
$ ls -- $myPath
517+
```
518+
519+
上面例子中,`--`强制变量`$myPath`只能当作路径名解释。
520+
521+
如果变量不是路径名,就会报错。
522+
523+
```bash
524+
$ myPath="-l"
525+
$ ls -- $myPath
526+
ls: 无法访问'-l': 没有那个文件或目录
527+
```
528+
529+
上面例子中,变量`myPath`的值为`-l`,不是路径。但是,`--`强制`$myPath`只能作为路径解释,导致报错“不存在该路径”。
530+

0 commit comments

Comments
 (0)