# 1.Bash Shell 初步认识
1. 什么是 Bash shell (壳) Bash Shell 是一个命令解释器,它在操作系统的最外层,负责用户程序与内核进行交互操作的一种接口,将用户输入的命令翻译给操作系统,并将处理后的结果输出至屏幕。 当我们使用远程连接工具连接 linux 服务,系统则会给打开一个默认的 shell,我们可在这个界面执行命令、比如:获取系统当前时间,创建一个用户等等...
2.Bash Shell 能干什么? 使用 Shell 实现对 Linux 系统的大部分管理,例如: 1. 文件管理 2. 权限管理 3. 用户管理 4. 磁盘管理 5. 网络管理 6. 软件管理。等等. 3. 平时我们如何使用 Shell 呢? 输入命令 --> 效率低 --> 适合少量的工作 Shell Script --> 效率高 --> 适合复杂重复性的工作 例如:创建 100 个用户,单纯输入命令需要执行 100 次,而 Shell 脚本只需要几行命令即可完成 100 个用户的创建 4.Shell 提示符
# $ = 普通用户,# = root 用户 (超级管理员) | |
[root@xuliangwei ~]# whoami | |
root | |
[root@web01 ~]# useradd jack | |
[root@web01 ~]# passwd jack | |
Changing password for user jack. | |
New password: | |
BAD PASSWORD: The password is a palindrome | |
Retype new password: | |
passwd: all authentication tokens updated successfully. |
5.Shell 基础语法 命令行 bash shell, 为用户提供输入,执行命令的界面
#命令 选项 参数 | |
command [-options] [arguments] | |
[root@xuliangwei ~]# ls #命令 | |
[root@xuliangwei ~]# ls -a #命令 + 选项 | |
[root@xuliangwei ~]# ls -a /home/ #命令 + 选项 + 参数 | |
#命令:整条 shell 命令的主体 | |
#选项:用于调节命令的具体功能 | |
#以 “-” 引导短格式选项(单个字符),例如 “-l” | |
#以 “--” 引导长格式选项(多个字符),例如 “--color” | |
#多个短格式选项可以写在一起,只用一个 “-” 引导,例如 “-al” | |
#参数:命令操作的对象,如文件、目录名等 | |
# 命令必须开头, 选项和参数位置可以发生变化 |
# 2.Bash Shell 基本特性
1. 命令补全 当使用 windows 查找一个目录层级特别多的文件时,打开的效率会非常的慢,但如果使用 linux 查找一个目录层级特别多的文件时,可以通过 tab 键快速的补全 PS: tab 键可以实现命令补全,路径补全,在实际生产中 tab 补全往往是我们使用的最多的,因为可以减少执行命令以及路径出错率。
#查看 ip 时忘记具体了命令 | |
[root@xuliangwei ~]# ifcon | |
#按下 tab 键会自动补全 | |
[root@xuliangwei ~]# ifconfig | |
#按一下 tab 键没有反应,按两下 tab 键列出所有 if 开头的命令 | |
[root@xuliangwei ~]# if | |
if ifconfig ifenslave ifrename | |
ifcfg ifdown ifnames ifup | |
#linux 目录较深,经常使用 tab 键进行补全,如果路径出错是没有办法补全 | |
[root@xuliangwei ~]# ls /etc/sysconfig/network-scripts/ |
2. 命令快捷键,快捷键可以帮助我们大大提升工作效率
Ctrl + a #光标跳转至正在输入的命令行的首部 | |
Ctrl + e #光标跳转至正在输入的命令行的尾部 | |
Ctrl + c #终止前台运行的程序 | |
Ctrl + d #在 shell 中,ctrl-d 表示推出当前 shell。 | |
Ctrl + z #将任务暂停,挂至后台 | |
Ctrl + l #清屏,和 clear 命令等效。 | |
Ctrl + k #删除从光标到行末的所有字符 | |
Ctrl + u #删除从光标到行首的所有字符 | |
Ctrl + r #搜索历史命令,利用关键字 | |
#在命令行前加面加 "#" 则该命令不会被执行 |
3. 历史命令 History, 追溯之前发生情况 -w 保存命令历史到历史文件 -c 清空命令历史记录,不会情况文件 -d 删除命令历史的第 N 条行
#1. 使用双!!可执行上一条执行过的命令 | |
[root@xuliangwei ~]# ls | |
xuliangwei.com | |
[root@xuliangwei ~]# !! | |
ls | |
xuliangwei.com | |
#2. 输入!6, 执行 history 命令历史中第 6 行命令 | |
[root@xuliangwei ~]# !6 | |
touch xuliangwei.com | |
#使用!cat, 调用 history 命令历史最近一次执行过的 cat 命令 | |
[root@xuliangwei ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 | |
[root@xuliangwei ~]# !cat | |
cat /etc/sysconfig/network-scripts/ifcfg-eth0 | |
[root@xuliangwei ~]# ls /etc/passwd | |
#调用上一条命令的最后参数或选项,按下 ESC 松开,然后按下 "." | |
[root@xuliangwei ~]# cat | |
[root@xuliangwei ~]# cat /etc/passwd | |
#第二种方式,输入!$ | |
[root@xuliangwei ~]# ls !$ | |
ls /etc/passwd | |
/etc/passwd |
3. 命令别名 命令别名将用户经常使用的复杂命令简单化,可以用 "alias 别名名称=命令" 命令创建属于自己的命令别名,若要取消一个命令别名,则是用 unalias 别名名称 命令。
#1. 定义临时别名,wk 为查看 eth0 网卡别名 | |
[root@xuliangwei ~]# alias wk='ifconfig' | |
[root@xuliangwei ~]# wk | |
#2. 如果定义命令本身,会执行什么? | |
[root@xuliangwei ~]# alias ifconfig='ifconfig eth0' | |
#绝对路径执行,调用命令本身 | |
[root@xuliangwei ~]# /sbin/ifconfig | |
#通过 \ 转义字符,调用命令本身 | |
[root@WebServer ~]# \ifconfig | |
#3. 取消别名 | |
[root@xuliangwei ~]# unalias ifconfig | |
#4. 永久生效,/etc/bashrc | |
[root@xuliangwei ~]# echo "alias ifconfig='ifconfig eth0'" >> /etc/bashrc |
# 3.Bash Shell 获取帮助
1. 命令 --help 帮助
[root@xuliangwei ~]# ls --help | |
用法: ls [选项]...[文件]... | |
#ls 常见选项 | |
-a #查看目录下的所有文件,包括隐藏文件 | |
-l #以长格式的方式显示文件的详细内容 | |
-h #以人性化的方式显示内容,配合 - l 使用 | |
-d #只列出目录名,不列出目录以下的内容 | |
-t #按修改时间进行排序 | |
-i #显示文件的 inode (该文件在该分区的一个编号) | |
[root@xuliangwei ~]# date --help | |
Usage: date [OPTION]... [+FORMAT] | |
or: date [-u--utc--universal] [MMDDhhmm[[CC]YY][.ss]] | |
[root@xuliangwei ~]# date +% F #查看日期 | |
2019-03-28 | |
[root@xuliangwei ~]# date -s 12:00 #修改时间 | |
#时间不是用来查看,而是有其他的用途 | |
[root@web01 ~]# touch `date +%F`_file.txt | |
[root@web01 ~]# ls | |
2019-03-28_file.txt |
2. 命令 man 手册
# man ls #查看 ls 命令的手册 |
3.linux 命令大全 url 传送门 linux 命令大全 linux 命令手册
# 4.Bash Shell 命令流程
1. 当我们执行一个命令,整个命令执行流程如下: 1) 判断命令是否通过绝对路径执行 2) 判断命令是否存在 alias 别名 3) 判断用户输入的是内部命令还是外部命令 4) Bash 内部命令直接执行,外部命令检测是否存在缓存 5) 通过 PATH 路径查找命令,有执行,无报错 2. 什么是内部命令,什么是外部命令 内部命令: shell 程序自带的命令。 外部命令:在系统 PATH 变量的某个路径下的可执行程序。 3. 如何检查用户输入的命令是内部命令还是外部命令
#cd 命令属于 shell 内部命令 | |
[root@linux-node1 ~]# type -a cd | |
cd is a shell builtin | |
cd is /usr/bin/cd | |
#ping 属于外部命令,同时会打印当前命令路径 | |
[root@xuliangwei ~]# type -a ping | |
ping is /bin/ping |
4. 如果是外置命令,Bash 可以通过查找 PATH 变量,获取该命令的绝对路径。
#打印当前环境变量目录 | |
[root@xuliangwei ~]# echo $PATH | |
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin |
PS: PATH 由多个路径组成,每个路径值之间用冒号间隔,对这些路径的增加和删除操作都将影响到 Bash 解释器对 Linux 命令的查找 5. 如果是外置命令还会涉及到一个内存缓存,也就是说,当我们出现重复执行相同的命令,会通过缓存调取执行,也就意味着不会搜索 PATH 路径。
#表缓存命令所在位置 | |
[root@xuliangwei ~]# hash | |
hits command | |
1 /usr/bin/tty | |
3 /sbin/ifconfig | |
#已缓存命令,如果移动位置会导致无法找到该命令 | |
[root@xuliangwei ~]# mv /sbin/ifconfig /bin/ | |
[root@xuliangwei ~]# ifconfig | |
-bash: /sbin/ifconfig: No such file or directory | |
#删除缓存过的 ifconfig 命令,即可执行 | |
[root@xuliangwei ~]# hash -d ifconfig | |
[root@xuliangwei ~]# ifconfig | |
#当然可以清空缓存表 | |
[root@xuliangwei ~]# hash -r | |
#注意:命令缓存 hash 需要注意如下情况: | |
1.只要执行外部命令1次就会对该命令进行缓存 | |
2.如果将命令移动了位置,该如何执行 | |
a.使用绝对路径执行 | |
b.删除hash表的缓存指令 |
6. 命令执行流程总结:当我们执行了一个 ping 命令之后,整个命令执行的流程步骤如下: 1) 检查执行的命令是否使用的是绝对路径执行的。 2) 检查 ping 命令是否存在 alias 别名 3) 检查 ping 命令是内部命令还是外部命令 4) 如果是内部命令 Bash 直接执行,如果是外部命令,首先检查 Hash 缓存,存在则直接调取 5) 如果该命令不存在 Hash 缓存,则通过 PATH 路径进行逐行查找该命令所在的位置 6) 如果 PATH 路径没有查找到该命令所在的路径,则返回错误码。command not found
