第四章:Linux系统学习——Bash Shell初识

第四章:Linux系统学习——Bash Shell命令行初识

一、Bash Shell初步认识

1.什么是Bash Shell?

在这里插入图片描述

	Bash Shell是一个命令解释器,它在操作系统的最外层,负责用户程序与内核进行交互操作的一种接口,将用户输入的命令翻译给操作系统
并将处理后的结果输出至屏幕。当我们使用远程连接工具连接linux服务,系统则会给打开一个默认的shell,我们可在这个界面执行命令等一系
列操作,比如:获取系统当前时间,创建一个用户等等....

2.Bash Shell的作用

使用Shell实现对Linux系统的大部分管理,例如:

1)文件管理
2)权限管理
3)用户管理
4)磁盘管理
5)网络管理
6)软件管理
7)应用管理
..........等等管理

3.如何使用Shell及执行方式

命令执行:操作简单,主要针对一些简单的管理进行操作(输入命令 --> 效率低 -->适合少量的工作)

#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>

这是自由软件,您可以自由地更改和重新发布。
在法律允许的范围内没有担保.

4.Shell命令行提示符及基础语法

1)Shell提示符

命令行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\]]\\$ "
2)Shell基础语法
# 命令      选项        参数
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> 命令是对的,系统中没有安装,需要安装命令才能使用

二、Bash Shell的基本特性

1.命令补全

	当使用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

2.命令快捷键

命令快捷键,快捷键可以帮助我们大大提升工作效率

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  + .    #获取最后的指令
!!        #执行上一条所执行的命令
!命令        #执行最近一次以命令以什么开头的命令
#在命令行前加面加 "#" 则该命令不会被执行

3.历史记录命令

  # 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

4.命令别名

命令别名讲用户经常使用的复杂命令简单化,创建出属于自己的命令别名。

  # 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: 未找到命令

5.获取命令帮助

  1. 使用man手册帮助信息,man命令是Linux下的帮助指令,通过man指令可以查看Linux中的指令帮助、配置文件帮助和编程帮助等信息。
  2. 命令都会有帮助信息的参数 --help,使用help参数获取命令帮助信息,help命令用于显示shell内部命令的帮助信息。help命令只能显示shell内部的命令帮助信息。
#1.使用man命令,查看cd命令使用
[root@template ~]# man ls

#2.使用help命令,查看cd命令使用
[root@template ~]# help cd

#3.大多数命令都带有--help帮助选项
[root@template ~]# ls --help

查看命令相关的站点:Linux命令使用手册1 Linux命令使用手册2

6.命令执行流程

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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值