Bash Shell是一个命令解释器,它在操作系统的最外层,负责用户程序与内核进行交互操作的一种接口,将用户输入的命令翻译给操作系统
并将处理后的结果输出至屏幕。当我们使用远程连接工具连接linux服务,系统则会给打开一个默认的shell,我们可在这个界面执行命令等一系
列操作,比如:获取系统当前时间,创建一个用户等等....
使用Shell实现对Linux系统的大部分管理,例如:
1)文件管理
2)权限管理
3)用户管理
4)磁盘管理
5)网络管理
6)软件管理
7)应用管理
..........等等管理
命令执行:操作简单,主要针对一些简单的管理进行操作(输入命令 --> 效率低 -->适合少量的工作)
#1.获取当前时间
[root@template ~]# date
2021年 05月 11日 星期二 16:36:03 CST
#2.创建文件、目录
[root@template ~]# touch file
[root@template ~]# mkdir catalog
脚本(Script):操作复杂, 操作一些复杂行性较大的操作(Shell Script --> 效率高–>适合复杂重复性的工作)
例如:如果创建100个用户,单纯输入命令需要执行100次,而Shell脚本只需要几行命令即可完成100个用户的创建
#1.创建100个用户
[root@template ~]# vim user.sh
for i in `seq 100`;do
useradd oldboy$n && \
echo "用户 oldboy$n 已创建成功"
done
:wq(保存退出)
#2.运行脚本
[root@template ~]# bash /root/user.sh
查看Bash Shell版本
[root@template ~]# bash -version
GNU bash, 版本 4.2.46(2)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
许可证 GPLv3+: GNU GPL 许可证版本3或者更高 <http://gnu.org/licenses/gpl.html>
这是自由软件,您可以自由地更改和重新发布。
在法律允许的范围内没有担保.
命令行bash shell,为用户提供输入, 执行命令的界面,管理员用户与普通用户命令行的差别
#1.root(超级管理员) #:root管理员用户
[root@template ~]#
#2.普通用户 $:普通用户
[test@template ~]$
命令行结构构成
命令行拆解:[root@template ~]#
[test@template ~]$
[]:中括号起到一个整合的作用
root:本身是超级管理员,现指当前登陆的用户 test:普通用户,限制当前登陆的用户
@:分隔符
template:当前主机名,可以进行修改
~:本身表示当前用户的家目录,当前用户所在的目录或者是路径,起到一个定位的作用
#:超级管理员命令行提示符(同时也是注释符,注释符后面的命令系统是不会执行的
$:普通用户命令行提示符
PS1的常用参数以及含义
\d :代表日期,格式为weekday month date,例如:"Mon Aug 1"
\H :完整的主机名称
\h :仅取主机名中的第一个名字
\t :显示时间为24小时格式,如:HH:MM:SS
\T :显示时间为12小时格式
\A :显示时间为24小时格式:HH:MM
\u :当前用户的账号名称
\v :BASH的版本信息
\w :完整的工作目录名称
\W :利用basename取得工作目录名称,只显示最后一个目录名
\# :下达的第几个命令
\$ :提示字符,如果是root用户,提示符为 # ,普通用户则为 $
#颜色
30 40 黑色
31 41 红色
32 42 绿色
33 43 黄色
34 44 蓝色
35 45 紫红色
36 46 青蓝色
37 47 白色
PS1='\[\e[32;40m\] \[[\u@\h \w \t]\$ \[\e[0m\]'
PS1="\[\e[37;40m\][\[\e[32;40m\]\u\[\e[37;40m\]@\h \[\e[36;40m\]\w\[\e[0m\]]\\$ "
PS1="\[\e[37;40m\][\[\e[32;40m\]\u\[\e[37;40m\]@\[\e[35;40m\]\h\[\e[0m\] \[\e[36;40m\]\w\[\e[0m\]]\\$ "
# 命令 选项 参数
command [-options] [arguments]
[root@template ~]# ls #命令
1
[root@template ~]# ls -a #命令+选项
. .. 1 .bash_history .bash_logout .bash_profile .bashrc .cshrc .tcshrc .viminfo
[root@template ~]# ls -a /root #命令+选项+参数
. .. 1 .bash_history .bash_logout .bash_profile .bashrc .cshrc .tcshrc .viminfo
//命令: 整条shell命令的主体
//选项: 用于调节命令的具体功能
以“-”引导短格式选项(单个字符),例如“-l”
以“--”引导长格式选项(多个字符),例如“--color”
多个短格式选项可以写在一起,只用一个“-”引导,例如“-al”,但是长引导格式不可写在一起
//参数: 命令操作的对象,如文件、目录名等
PS:命令必须打头,选项和参数位置可以发生变化
如果执行命令时报错
[root@template ~]# la -l
-bash: la: command not found(未找到命令)
[root@template ~]# ls /roott
ls: cannot access /roott: No such file or directory
No such file or directory(没有那个文件或者目录)
#解决方法:
1> 检查命令是否写错了,目标路径是否写对了、是否存在
2> 命令是对的,系统中没有安装,需要安装命令才能使用
当使用windows查找一个目录层级特别多的文件时,一般不会进行路径补全,但如果使用linux查找一个目录层级特别多的文件时,可以通过
tab键快速补全。
命令补全
选项补全
参数补全
PS:tab键可以使命令补全、路径补全,在实际生产中tab补全往往是我们使用的最多的,因为可以减少执行命令以及路径出错率,还能提高输入效
率。
#1.假如想查看ip地址,忘记了具体的命令
[root@template ~]# ifc #按tab键会出现相对应开头的
ifcfg ifconfig
[root@template ~]# ifcon #按tab键会自动补全
#2.按一下tab没有反应,那么需要按两下tab键,列出所有if开头的命令
[root@template ~]# if
if ifcfg ifconfig ifdown ifenslave ifnames ifrename iftop ifup
#3.Linux目录比较深,经常会使用tab键进行补全,如果路径出错是没有办法补全的
[root@template ~]# ls /etc/sysconfig/network-scripts/ifcfg-eth0
/etc/sysconfig/network-scripts/ifcfg-eth0
#4.如果无法补全选项,需要额外安装拓展包
[root@template ~]# yum install -y bash-completion
命令快捷键,快捷键可以帮助我们大大提升工作效率
Ctrl + a #光标跳转至当前行的行首
Ctrl + e #光标跳转至当前行的行尾
Ctrl + c #终止前台运行的程序,取消当前的操作
Ctrl + d #退出当前登录的用户,在shell中,ctrl-d表示退出当前shell。(logout、exit)
Ctrl + w #删除当前光标向前一组字符串,以空格为分隔符
Ctrl + z #将任务暂停,挂至后台
Ctrl + l #清屏 等于clear命令等效。
Ctrl + k #删除从光标到行末的所有字符
Ctrl + u #删除从光标到行首的所有字符
Ctrl + r #搜索历史命令, 利用关键字
Ctrl + s #锁屏
Ctrl + q #解锁
Ctrl + ← → #按照单词快速跳转光标
ESC + . #获取最后的指令
!! #执行上一条所执行的命令
!命令 #执行最近一次以命令以什么开头的命令
#在命令行前加面加 "#" 则该命令不会被执行
# history
history命令用来查看所有的历史记录指令【单独使用时,仅显示历史记录命令,在命令行中使用!+ n(n为历史记录的序号)
可以执行指定序号的历史命令。
语法:history 【选项】 【参数】
选项:
-d #删除指定的历史记录
-c #清空历史记录
-w #将当前的历史记录写入到默认文件中(可指文件写入:-w file)
#1.查看历史记录(默认以行号排序)
[root@template ~]# history
1 ip a
2 cd /etc/yum.repos.d/
3 ll
4 tar czf yuan.tar.gz ./*
5 ll
6 find ./ -name "*C*.repo"
7 rm -rf `find ./ -name "*C*.repo"`
8 ll
9 tar xf yuan.tar.gz
10 ll
11 cd
12 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
13 cd -
14 ll
15 rm -rf `find ./ -name "*C*.repo"`
16 ll
17 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
18 curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
19 ll
20 yum install -y vim
#2.#指定一条历史记录删除
[root@template ~]# history -d 93
#3.保存历史命令(默认保存在.bash_history文件中)
[root@template ~]# history -w
#5.执行上一条命令
[root@template ~]# !!
cat history
#6.执行最近一条vim相关命令
[root@template ~]# !vim
vim history
#7.执行历史命令中的第74条命令
[root@template ~]# !74
#8.清空历史记录
[root@template ~]# history -c
命令别名讲用户经常使用的复杂命令简单化,创建出属于自己的命令别名。
# alias
创建语法:alias 别名=”命令“
取消语法:unalias 别名
#1.定义临时别名,查看网络是否可以通,ping 百度,只对当前shell生效
[root@template ~]# alias baidu="ping www.baidu.com"
[root@template ~]# baidu
PING www.a.shifen.com (180.101.49.11) 56(84) bytes of data.
64 bytes from 180.101.49.11 (180.101.49.11): icmp_seq=1 ttl=128 time=10.2 ms
64 bytes from 180.101.49.11 (180.101.49.11): icmp_seq=2 ttl=128 time=10.1 ms
64 bytes from 180.101.49.11 (180.101.49.11): icmp_seq=3 ttl=128 time=12.8 ms
64 bytes from 180.101.49.11 (180.101.49.11): icmp_seq=4 ttl=128 time=13.2 ms
#2.查看所有已定义的别名
[root@template ~]# alias
alias baidu='ping www.baidu.com'
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
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'
#3.取消别名
[root@template ~]# unalias baidu
[root@template ~]# baidu
-bash: baidu: 未找到命令
#4.写入bashrc文件中使其永久生效
使用编辑器添加
[root@template ~]# vim /etc/bashrc
alias baidu="ping www.baidu.com"
或者直接写入文件中
[root@template ~]# echo "alias network='cat /etc/sysconfig/network-scripts/ifcfg-eth0'" >>/etc/bashrc
重载/etc/bashrc文件后生效
[root@template ~]# source /etc/bashrc
#5.取消永久生效
[root@template ~]# sed -i '/network/d' /etc/bashrc
重新打开一个bash窗口
[root@template ~]# network
bash: network: 未找到命令
#1.使用man命令,查看cd命令使用
[root@template ~]# man ls
#2.使用help命令,查看cd命令使用
[root@template ~]# help cd
#3.大多数命令都带有--help帮助选项
[root@template ~]# ls --help
查看命令相关的站点:Linux命令使用手册1 Linux命令使用手册2
1)当我们执行一个命令, 整个命令执行流程如下:
1> 判断命令是否通过绝对路径执行
2> 判断命令是否存在alias别名
3> 判断用户输入的是内部命令还是外部命令
4> Bash内部命令直接执行,外部命令检测是否存在缓存
5> 通过PATH路径查找命令,有执行,无报错
2)什么是内部命令,什么是外部命令
内部命令: shell程序自带的命令。
外部命令: 在系统PATH变量的某个路径下的可执行程序。
3)如何检查用户输入的命令是内部命令还是外部命令
# type
type命令被用于判断一个命令输入的命令属于内部命令还是外部命令
选项:
-a 显示一个名字的所有可能
-t 判断一个名字当前是否是alias、keyword、function、builtin、file
alias 别名
keyword 关键字,Shell保留字
function 函数,Shell函数
builtin 内建命令,Shell内建命令
file 文件,磁盘文件,外部命令
unfound 没有找到
-p 查看一个外部命令的路径
-P 查看内部命令路径
#1.判断命令是内置还是外部命令
[root@template ~]# type cd
cd 是 shell 内嵌
#2.判断并显示命令的所有信息
[root@template ~]# type -a cd
cd 是 shell 内嵌
cd 是 /usr/bin/cd
#3.判断命令是否是alias、keyword、function、builtin、file
[root@template ~]# type -t cd
builtin
[root@template ~]# type -at ls
alias
file
#4.查看外部命令的路径
[root@template ~]# type -p tail
/usr/bin/tail
#5.查看内部命令的路径
[root@template ~]# type -P cd
/usr/bin/cd
4)如果是外置命令,Bash可以通过查找PATH变量,获取该命令的绝对路径
#打印当前环境变量目录
[root@template ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
PS: PATH由多个路径组成,每个路径值之间用冒号间隔,对这些路径的增加和删除操作都将影响到Bash解释器对
Linux命令的查找
5)如果是外置命令还会涉及到一个内存缓存,也就是说,当我们重复执行相同的命令时,意味着不会搜索PATH路径,直接调取内存缓存
#1.表缓存命令所在位置
[root@template ~]# hash
hits command
1 /usr/bin/tty
3 /sbin/ifconfig
#2.已写入缓存的命令,如果移动位置会导致无法找到该命令
[root@template ~]# mv /sbin/ifconfig /bin/
[root@template ~]# ifconfig
-bash: /sbin/ifconfig: No such file or directory
#3.删除缓存过的ifconfig命令, 即可执行
[root@xuliangwei ~]# hash -d ifconfig
[root@xuliangwei ~]# ifconfig
#4.当然也可以清空缓存表
[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