File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 1- Bash 教程(正在撰写中) 。
1+ 本教程介绍 Linux 命令行 Bash 的基本用法和脚本编程 。
Original file line number Diff line number Diff line change 22
33Bash 是 Unix 系统和 Linux 系统的一种 Shell(命令行环境),是目前绝大多数 Linux 发行版的默认 Shell。
44
5- ## Shell 是什么
5+ ## Shell 和 Bash
66
77Shell 有多种含义。
88
@@ -14,7 +14,9 @@ Shell 有多种含义。
1414
1515Shell 这个单词的原意是“外壳”,跟 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
3436Linux 允许每个用户使用不同的 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` 。
Original file line number Diff line number Diff line change @@ -110,3 +110,38 @@ PS1='\[\033[0;31m\]<\u@\h \W>\$\[\033[00m\]'
110110PS1=' \[\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+
Original file line number Diff line number Diff line change @@ -98,6 +98,8 @@ Readline 提供了许多快捷键,用来快速地移动光标。默认的快
9898
9999## 操作历史
100100
101+ ### 基本用法
102+
101103Bash 会保留用户的操作历史,即用户输入的每一条命令。退出当前 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
Original file line number Diff line number Diff 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 ` 命令,可以显示所有别名。
Original file line number Diff line number Diff 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
417424lower
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+
You can’t perform that action at this time.
0 commit comments