目录
初识shell
shell是一门语言,语言分为:
计算机语言:c语言、c++、Java、php、python、go、shell
编译型语言:c++、java
解释性语言:php、python、bash
编译型语言:编译型语言首先将源代码编译生成机器语言,再由机器运行机器码(二进制)。像c/c++等都是编译型语言。
解释型语言:源代码不是直接翻译成机器语言,而是先翻译成中间代码,再由解释器对中间代码进行解释运行。比如:python/javascript/shell等都是解释型语言
shell定义
shell也是一种程序设计语言,他有变量,关键字,各种控制语句,有自己的语法结构,利用shell程序设计语言可以编写功能很强、代码简短的程序。
shell是外壳的意思,就是系统的外壳,我们可以通过shell的命令啦控制和操作操作系统,比如linux中的shell命令就包括ls、cd、pwd、等,总结来说shell就是一个命令解释器,他通过接受用户输入的shell命令来启动、停止程序的运行或者对计算机进行控制。
shell能做什么
1、自动化批量系统初始化程序(update、软件安装、时区设置、安全策略)
2、自动化批量软件部署程序(lamp、lnmp、tomcat、lvs,nginx)
3、应用管理程序(kvm、集群管理扩容,mysql、dellr720批量raid)
4、日志分析处理程序(PV、uv、200、!200、top100、grep/awk)
5、自动化备份恢复程序(mysql完全备份/增量/差异+crond)
6、自动化管理程序(批量远程修改密码。软件升级、配置更新)
7、自动化信息采集及监控程序(收集系统/应用状态信息、CPU、mem、disk、net、tcp status、apache、mysql)
8、配合zabbix信息采集(收集系统/应用状态信息,cpu、mem、disk、net、tcpstatus、apache、mysql)
9、自动化扩容(增加云主机-->业务上线)
10、shell可以做任何事,一切基于业务需求。
shel的分类和更改:
[root@nfy ~]# cat /etc/shells 查看系统支持哪些shell
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
[root@nfy ~]# chsh -l 查看所有的shell
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
shell的特性
shell命令解释器
linux支持的shell
#cat /etc/shells #chsh -l
gnu/bash shell特点
一、命令和文件自动补齐
二、命历史记忆功能
上下键调动历史命令 、!number(命令序号)、!$
三、快捷键
Ctrl+a 切换到命令行开始(跟home一样,但是home在某些unix环境下无法使用)
Ctrl+e 切换到命令行末尾
Ctrl+u 清除剪切光标之前的内容
Ctrl+k 清除剪切光标之后的内容
ctrl+y 粘贴刚才锁删除的字符
ctrl+左右键 快速移动光标
Ctrl+r 在历史命令中查找,输入关键字调出之前的命令
四、前后台作业控制
&:后台运行
ctrl+c:终止
ctrl+z:暂停
bg %num:将一个在后台暂停的命令继续执行
fg %num:将后台中的命令调至前台执行
kill %num:杀死后台的某个人进程
五、输入输出重定向
文件描述符与输出重定向:
在 shell程序中,最常使用的FD (file descriptor) 大概有三个, 分别是:
stdin(0): keyboard 键盘输入,并返回在前端
stdout(1): monitor 正确返回值 输出到前端
stderr(2): monitor 错误返回值 输出到前端
>a.txt 覆盖重定向到a.txt
1>a.txt 正确的覆盖重定向到a.txt
2>a.txt 错误的输出到a.txt
&>a.txt 混合输出,正确的错误的都输出到a.txt
1>&2 混合输出
2>&1 混合输出
一般来说, "1>" 通常可以省略成 ">".
1>&2 正确返回值传递给2输出通道 &2表示2输出通道,之前如果有定义标准错误重定向到某log文件,那么标准输出也重定向到这个log文件,如果此处错写成 1>2, 就表示把1输出重定向到文件2中.
2>&1 错误返回值传递给1输出通道, 同样&1表示1输出通道.
六、管道 |tee
[root@nfy ~]# ip addr|grep 'inet'|tee c.txt|cat -n
1 inet 127.0.0.1/8 scope host lo
2 inet6 ::1/128 scope host
3 inet 192.168.242.137/24 brd 192.168.242.255 scope global dynamic ens33
4 inet6 fe80::a5e8:6219:e182:127a/64 scope link
tee命令用于将数据重定向到文件(有文件重定向到文件,没有则创建),另一方面还可以提供一份重定向数据的副本作为后续命令的stdin。简单的说就是把数据重定向到给定文件和屏幕上。
ip addr |grep 'inet ' |tee test |grep eth0 覆盖
ip addr |grep 'inet ' |tee -a test |grep eth0 -a 追加
七、命令排序
&& || ; 具备逻辑判断
; 无论前面是否执行成功,分号后的命令都会继续执行
&&:前面执行成功,后面的才继续执行
||:前面命令不成功,后面的命令也会继续
注意:
command & 后台执行
command &>/dev/null 混合重定向(标准输出1,错误输出2)
command1 && command2 命令排序,逻辑判断
八、shell通配符
元字符,表示的不是本意
字符 | 含义 | 实例 |
* | 匹配任意多个字符 | a*b a与b之间可以有任意长度的任意字符,也可以一个都没有,如aabcb,axyzb |
? | 匹配任意一个字符 | a?b a与b之间必须也只能有一个字符, 可以是任意字符 |
[] | 匹配括号中任意一个字符 | a[xyz]b a与b之间必须也只能有一个字符, 但只能是 x 或 y 或 z |
() | 在子shell中执行 | (cd /boot;ls) (umask 077; touch file1000) |
{} | 集合 | touch file{1..9} |
\ | 转义符,让元字符回归本意 | # echo * # echo \* |
脚本编写
1、创建bash脚本:以.sh结尾的文件,.py结尾的文件是python的脚本
# vim xxx.sh
#!/bin/bash 或者#!/usr/bin/env/bash
指定命令解释器:第一行的专门解释,他指明了当我们没有指定解释器的时候默认的解释器。直接使用./a.sh来执行这个脚本的时候,如果没有shebang,就会默认使用$shell指定的解释器,否则就会使用shebang指定的解释器,第一行可以写也可以不写,如果写的话一定要写正确。
注释:以#开头的都是注释,都不生效,注释的意义不仅在于用途,而在告诉我们注意事项,就像一个readme
2、修改权限(改不改路径都可以执行)
3、脚本的执行
#./scripts
#/shelldoc/scripts
#. ./scripts 使用当前登录shell执行
#source ./scripts 使用当前登录shell执行 比如cd /tmp会改变当前shell环境,但是其他的方式不会
#bash scripts 常用
4、脚本的调试
•sh –x script
这将执行该脚本并显示所有变量的值
•sh –n script
不执行脚本只是检查语法模式,将返回所有错误语法
•sh –v script
执行脚本前把脚本内容显示在屏幕上