目录
Shell 脚本的执行
[root@localhost sh]# vi hello.sh
#!/bin/Bash
#The first program
echo -e "hello world! "
- 注意:#!/bin/Bash,不能省略
- 在 Linux 中脚本的执行主要有这样两种种方法:
赋予执行权限,直接运行
- 这种方法是最常用的 Shell 脚本运行方法,也最为直接简单。就是赋予执行权限之后,直接运行。当然运行时可以使用绝对路径,也可以使用相对路径运行。命令如下:
[root@localhost sh]# chmod 755 hello.sh
#赋予执行权限
[root@localhost sh]# /root/sh/hello.sh
hello world!
#使用绝对路径运行
[root@localhost sh]# ./hello.sh
hello world!
#因为我们已经在/root/sh 目录当中,所以也可以使用相对路径运行
通过 Bash 调用执行脚本
- 这种方法也非常简单,不需要赋权限,直接执行,命令如下:
[root@localhost sh]# bash hello.sh
hello world!
Bash 的基本功能
历史命令
-
历史命令的查看
[root@localhost ~]# history [选项] [历史命令保存文件]
- 选项:
- -c: 清空历史命令
- -w: 把缓存中的历史命令写入历史命令保存文件。
- 如果不手工指定历史命令保存文件,则放入默认历史命令保存文件~/.bash_history 中
[root@localhost ~]# vi /etc/profile
…省略部分输出…
HISTSIZE=1000
…省略部分输出…
- 使用 history 命令查看的历史命令和~/.bash_history 文件中保存的历史命令是不同的。
- 那是因为当前登录操作的命令并没有直接写入~/.bash_history 文件,而是保存在缓存当中的。需要等当前用户注销之后,缓存中的命令才会写入~/.bash_history 文件。
- 如果我们需要把内存中的命令直接写入~/.bash_history 文件,而不等用户注销时再写入,就需要使用“-w”选项了。命令如下:
[root@localhost ~]# history -w
#把缓存中的历史命令直接写入~/.bash_history
- 这时再去查询~/.bash_history 文件,历史命令就和 history 命令查询的一致了。
- 如果需要清空历史命令,只需要执行:
[root@localhost ~]# history -c
#清空历史命令
历史命令的调用
- 如果想要使用原先的历史命令有这样几种方法:
- 使用上、下箭头调用以前的历史命令
- 使用“!n”重复执行第 n 条历史命令
- 使用“!!”重复执行上一条命令
- 使用“!字串”重复执行最后一条以该字串开头的命令
- 使用“!$”重复上一条命令的最后一个参数
命令与文件的补全
- 使用TAB键进行补全
命令别名
- 命令格式:
[root@localhost ~]# alias
#查询命令别名
[root@localhost ~]# alias 别名='原命令'
#设定命令别名
- 案例
[root@localhost ~]# alias
#查询系统中已经定义好的别名
alias cp='cp -i'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
[root@localhost ~]# alias vi='vim'
#定义 vim 命令的别名是 vi
- 既然我们说别名的优先级比命令高,那么命令执行时具体的顺序是什么呢?命令执行时的顺序是这样的:
- 第一顺位执行用绝对路径或相对路径执行的命令。
- 第二顺位执行别名。
- 第三顺位执行 Bash 的内部命令。
- 第四顺位执行按照$PATH 环境变量定义的目录查找顺序找到的第一个命令。
- 为了让这个别名永久生效,可以把别名写入环境变量配置文件“~/.bashrc”。命令如下:
[root@localhost ~]# vi /root/.bashrc
Bash 常用快捷键
快捷键 | 作 用 |
ctrl+A | 把光标移动到命令行开头。如果我们输入的命令过长,想要把光标移动到命令行开头时使用。 |
ctrl+E | 把光标移动到命令行结尾。 |
ctrl+C | 强制终止当前的命令。 |
ctrl+L | 清屏,相当于 clear 命令。 |
ctrl+U | 删除或剪切光标之前的命令。我输入了一行很长的命令,不用使用退格键一个一个字符的删除,使用这个快捷键会更加方便 |
ctrl+K | 删除或剪切光标之后的内容。 |
ctrl+Y | 粘贴 ctrl+U 或 ctrl+K 剪切的内容。 |
ctrl+R | 在历史命令中搜索,按下 ctrl+R 之后,就会出现搜索界面,只要输入搜索内容,就会从历史命令中搜索。 |
ctrl+D | 退出当前终端。 |
ctrl+Z | 暂停,并放入后台。这个快捷键牵扯工作管理的内容,我们系统管理章节详细介绍。 |
ctrl+S | 暂停屏幕输出。 |
ctrl+Q | 恢复屏幕输出。 |
输入输出重定向
Bash 的标准输入输出
设备 | 设备文件名 | 文件描述符 | 类型 |
键盘 | /dev/stdin | 0 | 标准输入 |
显示器 | dev/stdout | 1 | 标准输出 |
显示器 | /dev/stderr | 2 | 标准错误输出 |
输出重定向
类 型
| 符 号 | 作用 |
标准输出重定向
|
命令 > 文件
|
以覆盖的方式,把命令的正确输出输
出到指定的文件或设备当中。
|
标准输出重定向
| 命令 >> 文件 | 以追加的方式,把命令的正确输出输出到指定的文件或设备当中。 |
标准错误输出重定向 | 错误命令 2>文件 | 以覆盖的方式,把命令的错误输出输出到指定的文件或设备当中。 |
标准错误输出重定向 | 错误命令 2>>文件 | 以追加的方式,把命令的错误输出输 出到指定的文件或设备当中。 |
正确输出和错误输出同时保存 | 命令 > 文件 2>&1 | 以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中。 |
正确输出和错误输出同时保存 | 命令 >> 文件 2>&1 | 以追加的方式,把正确输出和错误输出都保存到同一个文件当中。 |
正确输出和错误输出同时保存 | 命令 &>文件 | 以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中。 |
正确输出和错误输出同时保存 | 命令 &>>文件 | 以追加的方式,把正确输出和错误输出都保存到同一个文件当中。 |
正确输出和错误输出同时保存 | 命令>>文件 1 2>>文件 2 | 把正确的输出追加到文件 1 中,把错误的输出追加到文件 2 中。 |
输入重定向
[root@localhost ~]# wc [选项] [文件名]
- 选项:
- -c 统计字节数
- -w 统计单词数
- -l 统计行数
多命令顺序执行
多命令执行符 | 格式 | 作 用 |
; | 命令 1 ;命令 2 | 多个命令顺序执行,命令之间没有任何逻辑联系 |
&& | 命令 1 && 命令 2 | 当命令 1 正确执行($?=0),则命令 2 才会执行 当命令 1 执行不正确($? ≠ 0),则命令 2 不会执行 |
|| | 命令 1 || 命令2 | 当命令 1 执行不正确($? ≠ 0),则命令 2 才会执行 当命令 1 正确执行($?=0),则命令 2 不会执行 |
- 案例1:
- 案例2
- 案例3
- 案例4
- 相当于if
管道符
行提取命令 grep
[root@localhost ~]# grep [选项] "搜索内容" 文件名
- 选项:
- -A 数字: 列出符合条件的行,并列出后续的 n 行
- -B 数字: 列出符合条件的行,并列出前面的 n 行
- -c: 统计找到的符合条件的字符串的次数
- -i: 忽略大小写
- -n: 输出行号
- -v: 反向查找
- --color=auto 搜索出的关键字用颜色显示
- 案例
[root@localhost ~]# grep "/bin/bash" /etc/passwd
#查找用户信息文件/etc/passwd 中,有多少可以登录的用户
[root@localhost ~]# grep -A 3 "root" /etc/passwd
#查找包含有“root”的行,并列出后续的 3 行
[root@localhost ~]# grep -n "/bin/bash" /etc/passwd
#查找可以登录的用户,并显示行号
[root@localhost ~]# grep -v "/bin/bash" /etc/passwd
#查找不含有“/bin/bash”的行,其实就是列出所有的伪用户
find 和 grep 的区别
- find 命令是在系统当中搜索符合条件的文件名,如果需要模糊查询,使用通配符进行匹配,搜索时文件名是完全匹配。
[root@localhost ~]# touch abc
#建立文件 abc
[root@localhost ~]# touch abcd
#建立文件 abcd
[root@localhost ~]# find . -name "abc"
./abc
#搜索文件名是 abc 的文件,只会找到 abc 文件,而不会找到文件 abcd
#虽然 abcd 文件名中包含 abc,但是 find 是完全匹配,只能和要搜索的数据完全一样,才能找到
- 注意:
- find 命令是可以通过-regex 选项识别正则表达式规则的,也就是说 find 命令可以按照正则表达式规则匹配,而正则表达式是模糊匹配。但是,find 命令和 grep 命令本身就不好理解,所以我们这里只按照通配符规则来进行 find 查询。
- grep 命令是在文件当中搜索符合条件的字符串,如果需要模糊查询,使用正则表达式进行匹配,搜索时字符串是包含匹配。
[root@localhost ~]# echo abc > test
#在 test 文件中写入 abc 数据
[root@localhost ~]# echo abcd >> test
#在 test 文件中再追加 abcd 数据
[root@localhost ~]# grep "abc" test
abc
abcd
#grep 命令查找时,只要数据行中包含有 abc,就会都列出
#所以 abc 和 abcd 都可以查询到
【注】:参考尚硅谷沈超老师教程