Linux-Shell
1.什么是Bash shell(壳)
Bash Shell是一个命令解释器,它在操作系统的最外层,负责用户程序与内核进行交互操作的一种接口,将用户输入的命令翻译给操作系统,并将处理后的结果输出至屏幕。
通过xshell连接,就是打开了一个bash程序的窗口,不能点鼠标,只能输入命令
当我们使用远程连接工具连接linux服务,系统则会给打开一个默认的shell,我们可在这个界面执行命令、比如:获取系统当前时间,创建一个用户等等…
2.Bash Shell能干什么?
使用Shell实现对Linux系统的大部分管理,例如:
1.文件管理(文件创建,移动,复制,删除,编辑…)
2.权限管理(不同用户不通权限)
3.用户管理(创建,删除….)
4.磁盘管理(挂载)
5.网络管理
6.软件管理
.等等.
3.平时我们如何使用Shell呢?
输入命令 –> 效率低 –>适合少量的工作
Shell Script –> 效率高–>适合复杂重复性的工作
例如:创建100个用户,单纯输入命令需要执行100次,而Shell脚本只需要几行命令即可完成100个用户的创建
vim test.sh for i in {1..100} do useradd test$i echo "create test$i" done bash test.sh
4.Shell提示符
# $ = 普通用户, # = root用户(超级管理员) ### [root@lqz ~]# # root:当前登录用户 # @ :没有意义 # lqz:主机名称,如果很长会显示不全,通过hostname查看 # ~:当前用户所在家目录 # #:通常指超级管理员 # $:普通用户 [root@lqz ~]# 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. [root@web01 ~]# su jack [root@web01 ~]# cd root 提示没有权限
5.Shell基础语法
命令行bash shell, 为用户提供输入, 执行命令的界面
#命令 选项 参数 command [-options] [arguments] [root@lqz ~]# ls #命令 [root@lqz ~]# ls -a #命令+选项 [root@lqz ~]# ls -a /home/ #命令+选项+参数 ls -a -l ls -la ls --all ls --list ls -c ls --color ls -a /tmp #命令: 整条shell命令的主体 #选项: 用于调节命令的输出效果 #以 “-”引导短格式选项(单个字符),例如“-l” #以“--”引导长格式选项(多个字符),例如“--color” #多个短格式选项可以写在一起,只用一个“-”引导,例如“-al” #参数: 命令操作的对象,如文件、目录名等 # 选项和参数可以出现位置调换,命令,选项,参数之间要至少有一个空格 # 命令必须开头, 选项和参数位置可以发生变化
2.Bash Shell基本特性
1.命令补全
当使用windows查找一个目录层级特别多的文件时,打开的效率会非常的慢,但如果使用linux查找一个目录层级特别多的文件时,可以通过tab键快速的补全
PS: tab键可以实现命令补全,路径补全,在实际生产中tab补全往往是我们使用的最多的, 因为可以减少执行命令以及路径出错率。
# yum provides ifconfig # yum install net-tools #查看ip时忘记具体了命令 [root@lqz ~]# ifcon #按下tab键会自动补全 [root@lqz ~]# ifconfig #按一下tab键没有反应, 按两下tab键列出所有if开头的命令 [root@lqz ~]# if if ifconfig ifenslave ifrename ifcfg ifdown ifnames ifup #linux目录较深,经常使用tab键进行补全, 如果路径出错是没有办法补全(带斜线表示是目录(window叫文件夹)) [root@lqz ~]# ls /etc/sysconfig/network-scripts/ # 安装选项补全 yum install bash-comple* yum install bash-completion # ls -- Tab建,空格上下翻
2.命令快捷键,快捷键可以帮助我们大大提升工作效率
Ctrl + a #光标跳转至正在输入的命令行的首部 Ctrl + e #光标跳转至正在输入的命令行的尾部 Ctrl + c #终止前台运行的程序 Ctrl + d #在shell中,ctrl-d表示推出当前shell。 Ctrl + z #将任务暂停,挂至后台 Ctrl + l #清屏,和clear命令等效。 Ctrl + k #删除从光标到行末的所有字符 Ctrl + u #删除从光标到行首的所有字符 Ctrl + r #搜索历史命令, 利用关键字,Tab建选中 Ctrl + w #按单词或空格进行向前删除 Ctrl + 左右建 #按单词或空格进行向前向后跳 #在命令行前加面加 "#" 则该命令不会被执行
3.历史命令History, 追溯之前发生情况
-w 保存命令历史到历史文件
-c 清空命令历史记录, 不会情况文件
-d 删除命令历史的第 N 条行
#1.使用双 !! 可执行上一条执行过的命令 [root@lqz ~]# ls lqz.com [root@lqz ~]# !! ls lqz.com #2.输入!6, 执行history命令历史中第 6 行命令 [root@lqz ~]# !6 touch lqz.com #使用!cat, 调用history命令历史最近一次执行过的cat命令 [root@lqz ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 [root@lqz ~]# !cat # 最近一次 cat /etc/sysconfig/network-scripts/ifcfg-eth0 [root@lqz ~]# ls /etc/passwd #调用上一条命令的最后参数或选项, 按下ESC松开, 然后按下 "." [root@lqz ~]# cat [root@lqz ~]# cat /etc/passwd #第二种方式, 输入!$ [root@lqz ~]# ls !$ ls /etc/passwd /etc/passwd # history -d 100 删除第100条历史记录 # history -c 清空记录(保存到文件中的还有) # history -w 保存历史集合,保存到当前用户的家目录 .bash_history # > .bash_history 清空文件的保存(操作完,不让别人看你执行的命令)
3.命令别名
命令别名将用户经常使用的复杂命令简单化, 可以用"alias 别名名称=命令"
命令创建属于自己的命令别名, 若要取消一个命令别名,则是用unalias 别名名称
命令。
#1.定义临时别名, wk为查看eth0网卡别名 [root@lqz ~]# alias wk='ifconfig' # alias 查看一下是否成功,发现系统内置了很多 [root@lqz ~]# wk # 取消别名(都是临时的) [root@lqz ~]# unalias wk #2.如果定义命令本身, 会执行什么? [root@lqz ~]# alias ifconfig='ifconfig eth0' #绝对路径执行, 调用命令本身 [root@lqz ~]# /sbin/ifconfig #通过转义字符, 调用命令本身 [root@WebServer ~]# ifconfig #3.取消别名 [root@lqz ~]# unalias ifconfig #4.永久生效,/etc/bashrc [root@lqz ~]# echo "alias ifconfig='ifconfig eth0'" >> /etc/bashrc
3.Bash Shell获取帮助
1.命令 –help帮助
[root@lqz ~]# ls --help 用法: ls [选项]...[文件]... #ls 常见选项 -a #查看目录下的所有文件,包括隐藏文件 -l #以长格式的方式显示文件的详细内容 -h #以人性化的方式显示内容,配合-l使用 -d #只列出目录名,不列出目录以下的内容 -t #按修改时间进行排序 -i #显示文件的inode(该文件在该分区的一个编号) [root@lqz ~]# date --help Usage: date [OPTION]... [+FORMAT] or: date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]] [root@lqz ~]# date +%F #查看日期 2019-03-28 [root@lqz ~]# 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@lqz ~]# type -a ping ping is /bin/ping
4.如果是外置命令,Bash可以通过查找PATH变量,获取该命令的绝对路径。
#打印当前环境变量目录 [root@lqz ~]# echo $PATH /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PS: PATH由多个路径组成,每个路径值之间用冒号间隔,对这些路径的增加和删除操作都将影响到Bash解释器对Linux命令的查找
5.如果是外置命令还会涉及到一个内存缓存,也就是说,当我们出现重复执行相同的命令,会通过缓存调取执行,也就意味着不会搜索PATH路径。
#表缓存命令所在位置 [root@lqz ~]# hash hits command 1 /usr/bin/tty 3 /sbin/ifconfig #已缓存命令,如果移动位置会导致无法找到该命令 [root@lqz ~]# mv /sbin/ifconfig /bin/ [root@lqz ~]# ifconfig -bash: /sbin/ifconfig: No such file or directory #删除缓存过的ifconfig命令, 即可执行 [root@lqz ~]# hash -d ifconfig [root@lqz ~]# ifconfig #当然可以清空缓存表 [root@lqz ~]# 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
查看Linux内核版本和系统版本
查看Linux内核版本命令(两种方法) 方式1 [root@lqz ~]# cat /proc/version Linux version 3.10.0-957.21.3.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) ) #1 SMP Tue Jun 18 16:35:19 UTC 2019 方式2 [root@lqz ~]# uname -a Linux lqz 3.10.0-957.21.3.el7.x86_64 #1 SMP Tue Jun 18 16:35:19 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux 查看Linux系统版本的命令(3种方法) 方式1 #可列出所有版本信息: #这个命令适用于所有的Linux发行版,包括RedHat、SUSE、Debian…等发行版 [root@lqz ~]# lsb_release -a LSB Version: :core-4.1-amd64:core-4.1-noarch Distributor ID: CentOS Description: CentOS Linux release 7.6.1810 (Core) Release: 7.6.1810 Codename: Core 方式2 [root@lqz ~]# cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) #这种方法只适合Redhat系的Linux 方式3 # 此命令也适用于所有的Linux发行版。 [root@lqz ~]# cat /etc/issue \S Kernel \r on an \m