docs: edit variable

This commit is contained in:
ruanyf
2020-03-29 19:12:13 +08:00
parent e5f1fc634a
commit fc778f0832
6 changed files with 139 additions and 22 deletions

View File

@@ -1 +1 @@
Bash 教程(正在撰写中) 本教程介绍 Linux 命令行 Bash 的基本用法和脚本编程

View File

@@ -2,7 +2,7 @@
Bash 是 Unix 系统和 Linux 系统的一种 Shell命令行环境是目前绝大多数 Linux 发行版的默认 Shell。 Bash 是 Unix 系统和 Linux 系统的一种 Shell命令行环境是目前绝大多数 Linux 发行版的默认 Shell。
## Shell 是什么 ## Shell 和 Bash
Shell 有多种含义。 Shell 有多种含义。
@@ -14,7 +14,9 @@ Shell 有多种含义。
Shell 这个单词的原意是“外壳”,跟 kernel 内核相对应比喻内核外面的一层即用户跟内核交互的对话界面。本书中除非特别指明Shell 指的就是命令行环境。 Shell 这个单词的原意是“外壳”,跟 kernel 内核相对应比喻内核外面的一层即用户跟内核交互的对话界面。本书中除非特别指明Shell 指的就是命令行环境。
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 当作同义词使用,可以互换。 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 当作同义词使用,可以互换。
下面的命令可以查看当前运行的 Shell。 下面的命令可以查看当前运行的 Shell。
@@ -33,7 +35,7 @@ $ cat /etc/shells
Linux 允许每个用户使用不同的 Shell用户的默认 Shell 一般都是 Bash。 Linux 允许每个用户使用不同的 Shell用户的默认 Shell 一般都是 Bash。
## 如何进入命令行环境 ## 命令行环境
如果是不带有图形环境的 Linux 系统,启动后就直接是命令行环境。 如果是不带有图形环境的 Linux 系统,启动后就直接是命令行环境。
@@ -200,7 +202,7 @@ keyword
## Bash 的快捷键 ## Bash 的快捷键
Bash 有以下快捷键,可以大大方便操作。 Bash 提供很多快捷键,可以大大方便操作。下面的是一些最常用的,完整的介绍参见《行操作》一章。
- `Ctrl + L`:清除屏幕并将当前行移到页面顶部。 - `Ctrl + L`:清除屏幕并将当前行移到页面顶部。
- `Ctrl + C`:中止当前正在执行的命令。 - `Ctrl + C`:中止当前正在执行的命令。
@@ -208,7 +210,7 @@ Bash 有以下快捷键,可以大大方便操作。
- `Shift + PageDown`:向下滚动。 - `Shift + PageDown`:向下滚动。
- `Ctrl + U`:从光标位置删除到行首。 - `Ctrl + U`:从光标位置删除到行首。
- `Ctrl + K`:从光标位置删除到行尾。 - `Ctrl + K`:从光标位置删除到行尾。
- `Ctrl + D`:关闭shell会话。 - `Ctrl + D`:关闭 Shell 会话。
- `↑``↓`:浏览已执行命令的历史记录。 - `↑``↓`:浏览已执行命令的历史记录。
除了上面的快捷键Bash 还具有自动补全功能。命令输入到一半的时候,可以按下 Tab 键Bash 会自动完成剩下的部分。比如,输入`pw`,然后按一下 Tab 键Bash 会自动补上`d` 除了上面的快捷键Bash 还具有自动补全功能。命令输入到一半的时候,可以按下 Tab 键Bash 会自动完成剩下的部分。比如,输入`pw`,然后按一下 Tab 键Bash 会自动补上`d`

View File

@@ -110,3 +110,38 @@ PS1='\[\033[0;31m\]<\u@\h \W>\$\[\033[00m\]'
PS1='\[\033[0;41m\]<\u@\h \W>\$\[\033[0m\] ' PS1='\[\033[0;41m\]<\u@\h \W>\$\[\033[0m\] '
``` ```
## 环境变量 PS2PS3PS4
除了`PS1`Bash 还提供了提示符相关的另外三个环境变量。
环境变量`PS2`是命令行折行输入时系统的提示符,默认为`> `
```bash
$ echo "hello
> world"
```
上面命令中,输入`hello`以后按下回车键,系统会提示继续输入。这时,第二行显示的提示符就是`PS2`定义的`> `
环境变量`PS3`是使用`select`命令时,系统输入菜单的提示符。
环境变量`PS4`默认为`+ `。它是使用 Bash 的`-x`参数执行脚本时,每一行命令在执行前都会先打印出来,并且在行首出现的那个提示符。
比如下面是脚本`test.sh`
```bash
#!/bin/bash
echo "hello world"
```
使用`-x`参数执行这个脚本。
```bash
$ bash -x test.sh
+ echo 'hello world'
hello world
```
上面例子中,输出的第一行前面有一个`+ `,这就是变量`PS4`定义的。

View File

@@ -98,6 +98,8 @@ Readline 提供了许多快捷键,用来快速地移动光标。默认的快
## 操作历史 ## 操作历史
### 基本用法
Bash 会保留用户的操作历史,即用户输入的每一条命令。退出当前 Shell 的时候Bash 会将用户刚才的操作历史写入`~/.bash_history`文件该文件默认储存500个操作。 Bash 会保留用户的操作历史,即用户输入的每一条命令。退出当前 Shell 的时候Bash 会将用户刚才的操作历史写入`~/.bash_history`文件该文件默认储存500个操作。
环境变量`HISTFILE`总是指向这个文件。 环境变量`HISTFILE`总是指向这个文件。
@@ -107,6 +109,38 @@ $ echo $HISTFILE
/home/me/.bash_history /home/me/.bash_history
``` ```
有了操作历史以后,就可以使用方向键的`↑``↓`,快速浏览上一条和下一条命令。下面的方法还可以快速执行以前执行过的命令。
```bash
$ echo Hello World
Hello World
$ echo Goodbye
Goodbye
$ !e
echo Goodbye
Goodbye
$ !echo
echo Goodbye
Goodbye
$ !echo H
echo Goodbye H
Goodbye H
$ !echo H G
echo Goodbye H G
Goodbye H G
```
上面例子中,`!e`表示找出操作历史之中,最近的那一条以`e`开头的命令并执行。Bash 会先输出那一条命令`echo Goodbye`,然后直接执行。同理,`!echo`也会执行最近一条以`echo`开头的命令。
注意,`!string`语法只会匹配命令,不会匹配参数。所以`!echo H`不会执行`echo Hello World`,而是会执行`echo Goobye`,并把参数`H`附加在这条命令之后。同理,`!echo H G`也是等同于`echo Goodbye`命令之后附件`H G`
最后,按下 Ctrl + r 会显示操作历史可以用方向键上下移动选择其中要执行的命令。也可以键入命令的首字母Shell 就会自动在历史文件中,查询并显示匹配的结果。
### history 命令 ### history 命令
`history`命令能显示操作历史,即`.bash_history`文件的内容。使用该命令,而不是直接读取`.bash_history`文件的好处是,它会在所有的操作前加上行号,最近的操作在最后面,行号最大。 `history`命令能显示操作历史,即`.bash_history`文件的内容。使用该命令,而不是直接读取`.bash_history`文件的好处是,它会在所有的操作前加上行号,最近的操作在最后面,行号最大。
@@ -126,6 +160,8 @@ $ history
上面代码中,`%F`相当于`%Y - %m - %d``%T`相当于` %H : %M : %S` 上面代码中,`%F`相当于`%Y - %m - %d``%T`相当于` %H : %M : %S`
只要设置`HISTTIMEFORMAT`这个环境变量,就会保存命令的执行时间戳。如果不设置,就不会保存时间戳。
如果不希望保存本次操作的历史,可以设置环境变量`HISTSIZE`等于0。 如果不希望保存本次操作的历史,可以设置环境变量`HISTSIZE`等于0。
```bash ```bash
@@ -142,19 +178,13 @@ $ history | grep /usr/bin
上面命令返回`.bash_history`文件里面,那些包含`/usr/bin`的命令。 上面命令返回`.bash_history`文件里面,那些包含`/usr/bin`的命令。
还有一种更简便的搜索方式,就是按下`Ctrl - r`然后每键入一个字符Shell 就会自动在历史文件中,查询并显示匹配的结果。这时,上下移动选中想要执行的命令,按下回车键即可 操作历史的每一条记录都有编号。知道了命令的编号以后,可以用`感叹号 + 编号`执行该命令。如果想要执行`.bash_history`里面的第8条命令可以像下面这样操作
知道了命令的行号以后,可以用`感叹号 + 行号`执行该命令。如果想要执行`.bash_history`里面的第8个命令可以像下面这样操作。
```bash ```bash
$ !8 $ !8
``` ```
上面的命令执行操作历史里面第8条命令 `history`命令的`-c`参数可以清除操作历史
`感叹号 + 搜索字符串`会执行最近一个符合条件的命令。比如,以前执行过`netstat -np | grep 22`,那么输入`!net`就会执行这条命令。
`-c`参数可以清除操作历史。
```bash ```bash
$ history -c $ history -c

View File

@@ -282,6 +282,16 @@ $ alias rm='rm -i'
上面命令指定`rm`命令是`rm -i`,每次删除文件之前,都会让用户确认。 上面命令指定`rm`命令是`rm -i`,每次删除文件之前,都会让用户确认。
`alias`定义的别名也可以接受参数,但命令直接接受参数的效果是一样的。
```bash
$ alias echo='echo It says: '
$ echo hello world
It says: hello world
```
上面例子中,别名定义了`echo`命令的前两个参数,等同于修改了`echo`命令的默认行为。
指定别名以后,就可以像使用其他命令一样使用别名。一般来说,都会把常用的别名写在`~/.bashrc`的末尾。另外,只能为命令定义别名,为其他部分(比如很长的路径)定义别名是无效的。 指定别名以后,就可以像使用其他命令一样使用别名。一般来说,都会把常用的别名写在`~/.bashrc`的末尾。另外,只能为命令定义别名,为其他部分(比如很长的路径)定义别名是无效的。
直接调用`alias`命令,可以显示所有别名。 直接调用`alias`命令,可以显示所有别名。

View File

@@ -351,16 +351,23 @@ declare OPTION VARIABLE=value
`declare`命令的主要参数OPTION如下。 `declare`命令的主要参数OPTION如下。
- `-a`:声明数组变量。 - `-a`:声明数组变量。
- `-i`:声明整数变量。
- `-r`:声明只读变量。
- `-x`:该变量通过环境变量输出。
- `-u`:声明变量为大写字母。
- `-l`:声明变量为小写字母。
- `-f`:输出所有函数定义。 - `-f`:输出所有函数定义。
- `-F`:输出所有函数名。 - `-F`:输出所有函数名。
- `-i`:声明整数变量。
- `-l`:声明变量为小写字母。
- `-p`:查看变量信息。
- `-r`:声明只读变量。
- `-u`:声明变量为大写字母。
- `-x`:该变量输出为环境变量。
`declare`命令如果用在函数中,声明的变量只在函数内部有效,等同于`local`命令。 `declare`命令如果用在函数中,声明的变量只在函数内部有效,等同于`local`命令。
不带任何参数,`declare`直接执行可以输出当前环境的所有变量,包括函数在内。
```bash
$ declare
```
**1`-i`参数** **1`-i`参数**
`-i`参数声明整数变量以后,可以直接进行数学运算。 `-i`参数声明整数变量以后,可以直接进行数学运算。
@@ -417,12 +424,24 @@ $ echo $bar
lower lower
``` ```
**6不带参数使用** **6`-p`参数**
不带任何参数,`declare`直接执行可以输出当前环境的所有变量,包括函数在内 `-p`参数输出变量信息
```bash ```bash
$ declare $ foo=hello
$ declare -p foo
declare -- foo="hello"
$ declare -p bar
bar未找到
```
上面例子中,`declare -p`可以输出已定义变量的值,对于未定义的变量,会提出找不到。
如果不提供变量名,`declear -p`输出所有变量的信息。
```bash
$ declare -p
``` ```
**7`-f`参数** **7`-f`参数**
@@ -488,3 +507,24 @@ $ echo $v1,$v2
这种语法支持的运算符参考《Bash 的算术运算》一章。 这种语法支持的运算符参考《Bash 的算术运算》一章。
## 参数终止符 `--`
变量当作命令参数时,有时希望指定变量只能作为路径名,不能当作配置参数,这时可以使用参数终止符`--`
```bash
$ myPath="~/docs"
$ ls -- $myPath
```
上面例子中,`--`强制变量`$myPath`只能当作路径名解释。
如果变量不是路径名,就会报错。
```bash
$ myPath="-l"
$ ls -- $myPath
ls: 无法访问'-l': 没有那个文件或目录
```
上面例子中,变量`myPath`的值为`-l`,不是路径。但是,`--`强制`$myPath`只能作为路径解释,导致报错“不存在该路径”。