shell 第一天
shell编程初识
1.1 shell编程初识
shell的定义
Shell 是命令解释器 Shell 也是一种程序设计语言,它有变量,关键字,各种控制语句,有自己的语法结构,利用shell程序设计语言可以编写功 能很强、代码简短的程序
shell的分类和更改:
路径# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
默认shell: bash
注意:各种脚本里凡是/bin/sh表示的是使用默认bash
查看当前使用的shell: #echo $SEHLL
shell 的更改: #vim /etc/passwd
适用范围
什么时候不适合使用Shell编程:
- 资源紧张的项目,特别是那些速度是重要因素的地方(排序,散序,等等)
- 程序要进行很复杂的数学计算,特别是浮点计算,任意精度的计算,或者是复数计算
- 要求交叉编译平台的可移植性(使用C或者是Java代替)
- 需要结构化编程的复杂应用(需要变量类型检查和函数原型等等)
- 对于影响系统全局性的关键任务应用。
- 安全非常重要。你必须保证系统完整性和抵抗入侵,攻击和恶意破坏。
- 项目由连串的依赖的各个部分组成。
- 多种文件操作要求(Bash被限制成文件顺序存取,并且是以相当笨拙,效率低下的逐行的存取方式)
- 需要良好的多维数组支持。
- 需要类似链表或树这样的数据结构。
- 需要产生或操作图象或图形用户界面。
- 需要直接存取系统硬件。
- 需要端口号或是socket I/O。
- 需要使用可重用的函数库或接口。
- 所有的私有的不开源的应用程序(Shell脚本的源代码是直接可读,能被所有人看到的)
如果你需要有上面的任意一种应用,请考虑其他的更强大的脚本语言――Perl,Tcl,Python,Ruby,或者可能是其他更高级的 编译型语言,例如C,C++或者是Java
Shell 能做什么?
- 自动化批量系统初始化程序 (update,软件安装,时区设置,安全策略...)
- 自动化批量软件部署程序 (LAMP,LNMP,Tomcat,LVS,Nginx)
- 应用管理程序 (KVM,集群管理扩容,MySQL,DELLR720批量RAID)
- 日志分析处理程序(PV, UV, 200, !200, top 100, grep/awk)
- 自动化备份恢复程序(MySQL完全备份/增量 + Crond)
- 自动化管理程序(批量远程修改密码,软件升级,配置更新)
- 自动化信息采集及监控程序(收集系统/应用状态信息,CPU,Mem,Disk,Net,TCP Status,Apache,MySQL)
- 配合Zabbix信息采集(收集系统/应用状态信息,CPU,Mem,Disk,Net,TCP Status,Apache,MySQL)
- 自动化扩容(增加云主机——>业务上线) zabbix监控CPU 80%+|-50% Python API AWS/EC2(增加/删除云主机) + Shell Script(业务上线)
- 俄罗斯方块,打印三角形,打印圣诞树,打印五角星,运行小火车,坦克大战,排序算法实现
- Shell可以做任何事(一切取决于业务需求)
1.2shell特性回顾
bash初始化
bash的初始化 用户登录Linux时需要执行的几个文件: /etc/profile -> (~/.bash_profile | ~/.bash_login | ~/.profile) -> ~/.bashrc -> /etc/bashrc -> ~/.bash_logout
/etc/profile--->(~/.bash_profile ) ---> ~/.bashrc ---> /etc/bashrc
用户的初始化脚本
环境变量 修饰用户工作环境变量
这些文件为系统的每个用户设置环境信息Shell设置文件:
/etc/profile 这是系统主要的shell设置文件,也是用户登陆时系统先检查的文件,有关重要的环境变量都定义在此,其中包括PATH,USER,LOGNAME,MAIL,HOSTNAME,HISTSIZE,INPUTRC等。而在文件的后,它会检查并执行/etc/profile.d/*.sh的 脚本。
~/.bash_profile 这个文件是每位用户的bash环境设置文件,它存在与于用户的主目录中,当系统执行/etc/profile 后,就会接着读取此文件内的 设置值。在此文件中会定义USERNAME,BASH_ENV和PATH等环境变量,但是此处的PATH除了包含系统的$PATH变量外加入用户 的“bin”目录路径.
~/.bashrc 接下来系统会检查~.bashrc文件,这个文件和前两个文件(/etc/profile 和~/.bash_profile)大的不同是,每次执行 bash时,/.bashrc都会被再次读取,也就是变量会再次地设置,而/etc/profile,/.bash_profile只有在登陆时才读取。 就是因为要经常的读取,所以~/.bashrc文件只定义一些终端机设置以及shell提示符号等功能,而不是定义环境变量。
~/.bash_login 如果/.bash_profile文件不存在,则系统会转而读取/.bash_login这个文件内容。这是用户的登陆文件,在每次用户登陆系 统时,bash都会读此内容,所以通常都会将登陆后必须执行的命令放在这个文件中。
~/.profile 如果~/.bash_profile /.bash_login两个文件都不存在,则会使用这个文件的设置内容,其实它的功能与/.bash_profile 相同。
1.3shell编程特点
bash特性
补全 TAB
历史 history
别名 alias
快捷键 ctrl
前后台作业 &
重定向 > >> < <<
管道 |
命令排序执 ; && ||
通配符 {} ? *
正则表达式
脚本
历史命令
查看历史命令 history /etc/profile 下的historysize 可以修改
调用历史命令 上下健
!关键字
!历史命令行号
!! 执行上一条命令
!$ 上一条命令
alt+.
esc . 上一条命令的后一个参数
Ctrl+r 在历史命令中查找,输入关键字调出之前的命令
关键字+pgup/phdn 可以切换关键字相关的历史命令 显示历史命令执行时间:
1.设置变量:
HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S" 2.再次执行history查看结果
别名
别名 alias
设置别名
alias ll="ls -l"
Bash部分快捷键(常用)
Ctrl+a 切换到命令行开始(跟home一样,但是home在某些unix环境下无法使用)
Ctrl+e 切换到命令行末尾 Ctrl+u 清除剪切光标之前的内容
Ctrl+k 清除剪切光标之后的内容 ctrl+y 粘贴刚才锁删除的字符
Ctrl+r 在历史命令中查找,输入关键字调出之前的命令
通配符
- , ? , [] , {}
1.4shell脚本规范
[root@host ~]# vim helloworld.sh ---.sh代表这个文件是个shell脚本,拓展名后缀,如果省略.sh则不易判断该文件是否为shell脚本
1. #!/usr/bin/env bash ---shebang蛇棒, 解释器, 翻译 2. . 2 # Author: tiger
3. # Email: tigerfive@163.com
4. # Github: https://github.com/tigerfive ---这就是注释, 你没看错
5. # Date: 2019/**/**
6.
7. printf "hello world\n"
[root@host ~]# sh helloworld.sh
hello world
[root@host ~]# ./helloworld.sh
第一行: “#!/usr/bin/env bash”叫做shebang, shell语法规定shell脚本文件第一行为整个文件的解释器
第二行: 为“#”开头的行为注释行默认不会被程序所读取, 用来说明文件及标定所属人员使用, 也可用来解释程序
第七行: 为格式化打印语句printf, printf可以把后面的“hello world”打印到指定的终端中, \n 为换行符
1.5脚本运行方式
创建bash脚本
1.创建脚本文件
指定命令解释器
注释
编写bash指令集合
2.修改脚本权限,执行权
bash脚本的执行
#./scripts 使用当前shell执行 #source ./scripts
#/shelldoc/scripts
#. ./scripts 使用当前shell执行
#source ./scripts 比如cd /tmp会改变当前shell环境,但是其他的方式不会
#bash scripts
子shell
开启子进程 ()
# pwd
/root/shell
# (cd /tmp;touch test;)
# ls /tmp/test /tmp/test
# pwd
/root/shell
子shell能够继承父shell的一些属性,但是子shell不能够反过来改变父shell的属性
子shell的好处之一可以将复杂的任务分成多个小任务,并行处理,加快执行速度
所有shell的父shell父进程:
centos6 为 init
centos7为 sysemted
bash脚本测试
•sh –x script 这将执行该脚本并显示所有变量的值
•sh –n script 不执行脚本只是检查语法模式,将返回所有错误语法
•sh –v script 执行脚本前把脚本内容显示在屏幕上