shell介绍
一 什 么 是 shell?
Shell 是一类应用程序的统称,该类应用程序负责连接用户和 Linux 内核,让用户能够更加高效、安全、低成本地使用 Linux 内核来控制计算机硬件。具体来说,linux系统上自带多种shell程序
[root@localhost ~]# chsh -l
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh
通常用户登录成功后执行的shell程序为:/bin/bash
[root@localhost ~]# head -1 /etc/passwd root:x:0:0:root:/root:/bin/bash
其实,shell程序例如bash的本质就是一个解释器,shell本身就是一门解释型、弱类型、动态语言,与
python相对应,Python属于解释型、强类型、动态语言,我们平时登录成功一个用户后进入的就是bash解释器的交互式环境,我们敲的命令其实都属于shell这门语言的语法
Shell 是一类应用程序的统称,该类应用程序负责连接用户和 Linux 内核,让用户能够更加高效、安全、低成本地使用 Linux 内核来控制计算机硬件。
具体来说,linux系统上自带多种shell程序
[root@localhost ~]# chsh -l
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh
通常用户登录成功后执行的shell程序为:/bin/bash
[root@localhost ~]# head -1 /etc/passwd root:x:0:0:root:/root:/bin/bash
其实,shell程序例如bash的本质就是一个解释器,shell本身就是一门解释型、弱类型、动态语言,与
python相对应,Python属于解释型、强类型、动态语言,我们平时登录成功一个用户后进入的就是bash解释器的交互式环境,我们敲的命令其实都属于shell这门语言的语法
二 为何要用shell
那还用说吗,一些日常的运维工作自动化、配合计划任务威力无穷,彻底解放双手,你说它不香吗?例 如
1.拉取最新代码(git pull)
2.编译打包
3.上传并部署到远程服务器
三 shell VS python
shell语言
Shell 脚本的优势在于处理偏操作系统底层的业务,例如,Linux 内部的很多应用(有的是应用的一部分) 都是使用 Shell 脚本开发的,因为有 1000 多个 Linux 系统命令为它作支撑,特别是 Linux 正则表达式以及三剑客 grep、awk、sed 等命令。
对于一些常见的系统脚本,使用 Shell 开发会更简单、更快速,例如,让软件一键自动化安装、优化,监控报警脚本,软件启动脚本,日志分析脚本等,虽然 Python 也能做到这些,但是考虑到掌握难度、开发效率、开发习惯等因素,它们可能就不如 Shell 脚本流行以及有优势了。对于一些常见的业务应用,使用Shell 更符合 Linux 运维简单、易用、高效的三大原则
python语言
Python 是近几年非常流行的语言,它不但可以用于脚本程序开发,也可以实现 Web 程序开发(知乎、豆瓣、YouTube、Instagram 都是用 Python 开发),甚至还可以实现软件的开发(大名鼎鼎的OpenStack、SaltStack 都是 Python 语言开发)、游戏开发、大数据开发、移动端开发。
现在越来越多的公司要求运维人员会 Python 自动化开发,Python 也成了运维人员必备的技能,每一个运维人员在熟悉了 Shell 之后,都应该再学习 Python 语言。
Python 语言的优势在于开发复杂的运维软件、Web 页面的管理工具和 Web 业务的开发(例如 CMDB 自动化运维平台、跳板机、批量管理软件 SaltStack、云计算OpenStack 软件)等。
四 bash解释器特性
启动操作系统后,linux系统会默认提供5个操作终端(multics=》unix=》。。。=》linux),可以用 Ctrl + Alt + Fn(n=1,2,3,4,5...) 快捷键切换,我们进入任意终端后输入账号密码登录用户后,就会执行该用户在/etc/passwd文件中指定的解释器程序,然后进入解释器的交互式环境
[root@localhost ~]# head -1 /etc/passwd root:x:0:0:root:/root:/bin/bash # 最后一个字段就是指定的解释器程序
何为交互式环境???
1、我们为解释器输入指令,解释器解释执行(调用操作系统接口执行)然后后给我们返回结果,这就叫交互
2、进入解释器交互式环境后普通用户的提示符是$,管理用户是#
3、shell命令的基本格式/语法格式:命令 选项 参数
命令优先级从高到低
==> alias
==> Compound Commands
==> function
==> build_in
==> hash
==> $PATH
==> error: command not found
#1、alias别名
可以用alias查看
可以用命令来制作:alias 别名="命令 选项 参数"
#2、Compound Commands复合命令
复合命令指的是能够将一组命令封装到一个代码块里的命令,例如if、for、while等
#3、function函数
#4、build in内建命令
可以用type查看,或者用man builtin [root@egon ~]# type cd
cd 是 shell 内嵌
#5、hash
当别名和内部命令都搜到不到命令时,会检索$PATH中的路径
[root@egon ~]# sed -n 's/:/
/gp' <<< $PATH
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/root/bin
但是$PATH中包含的路径太多了,而且每个路径中的可执行文件也很多 如果每次都要搜索每个路径下的所有可执行文件,显然是不明智的
为了减少$PATH的搜索,上一次搜索的内容能够被下一次执行重用
bash对从$PATH中搜索得出的外部命令建立一个hash表,用于缓存
这个缓存是会话级别独立拥有的.不可以对其他终端共享,因为每个用户的$PATH可能不同[root@egon ~]# hostname # 执行一次$PATH中的命令,linux系统就会将其缓存起来egon.xxx.com
[root@egon ~]# hash # 可以查看hash表的缓存命中 命令
2 /usr/bin/hostname
1/usr/bin/sed
2/usr/bin/man
1 /usr/bin/ls
[root@egon ~]# hash -r # 也可以清空掉
[root@egon ~]# hash hash: 哈希表为空
#6、$PATH
略
==========================优先级验证======================
===========alias > Compound Commands > function========= #(1) 设置
[root@egon ~]# alias if="ls -l" [root@egon ~]# function if(){
> echo "123"
> }
#(2) 验证alias的优先级最高
[root@egon ~]# if
总用量 12
-rw-r--r-x. 1 root root 44 8月 13 19:36 1.sh
-rw-r--r-x. 1 root root 44 8月 13 19:36 2.sh
-rw-r--r-x. 1 root root 44 8月 13 19:37 3.sh
#(3) 取消别名,验证复合命令优先级>function [root@egon ~]# unalias if
[root@egon ~]# if # 执行的是复合命令而不是函数
>
===========function > buitin========= #(1) 设置
[root@egon ~]# function cd(){
> echo "自定义函数cd"
> }
[root@egon ~]# [root@egon ~]# type cd cd 是函数
cd ()
{
五 bash的特性
1、交互式环境下:命令和文件路径自动补全(使用tab键)
2、交互式环境下:命令历史记录上下键翻阅
!历史命令编号
!命令前缀字符
!$上一条命令的参数
!!执行最后一条命令3、别名功能
alias、unalias、命令
4、前后台作业: &、nohup、^c、^z、bg %1、fg %1、kill %3、screen