mirror of
https://github.com/wangdoc/bash-tutorial.git
synced 2025-12-20 02:18:48 +08:00
docs: edit variable
This commit is contained in:
@@ -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`。
|
||||||
|
|||||||
@@ -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\] '
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## 环境变量 PS2,PS3,PS4
|
||||||
|
|
||||||
|
除了`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`定义的。
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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`命令,可以显示所有别名。
|
||||||
|
|||||||
@@ -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`只能作为路径解释,导致报错“不存在该路径”。
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user