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编程:

  1. 资源紧张的项目,特别是那些速度是重要因素的地方(排序,散序,等等)
  2. 程序要进行很复杂的数学计算,特别是浮点计算,任意精度的计算,或者是复数计算
  3. 要求交叉编译平台的可移植性(使用C或者是Java代替)
  4. 需要结构化编程的复杂应用(需要变量类型检查和函数原型等等)
  5. 对于影响系统全局性的关键任务应用。
  6. 安全非常重要。你必须保证系统完整性和抵抗入侵,攻击和恶意破坏。
  7. 项目由连串的依赖的各个部分组成。
  8. 多种文件操作要求(Bash被限制成文件顺序存取,并且是以相当笨拙,效率低下的逐行的存取方式)
  9. 需要良好的多维数组支持。
  10. 需要类似链表或树这样的数据结构。
  11. 需要产生或操作图象或图形用户界面。
  12. 需要直接存取系统硬件。
  13. 需要端口号或是socket I/O。
  14. 需要使用可重用的函数库或接口。
  15. 所有的私有的不开源的应用程序(Shell脚本的源代码是直接可读,能被所有人看到的)
    如果你需要有上面的任意一种应用,请考虑其他的更强大的脚本语言――Perl,Tcl,Python,Ruby,或者可能是其他更高级的 编译型语言,例如C,C++或者是Java

Shell 能做什么?

  1. 自动化批量系统初始化程序 (update,软件安装,时区设置,安全策略...)
  2. 自动化批量软件部署程序 (LAMP,LNMP,Tomcat,LVS,Nginx)
  3. 应用管理程序 (KVM,集群管理扩容,MySQL,DELLR720批量RAID)
  4. 日志分析处理程序(PV, UV, 200, !200, top 100, grep/awk)
  5. 自动化备份恢复程序(MySQL完全备份/增量 + Crond)
  6. 自动化管理程序(批量远程修改密码,软件升级,配置更新)
  7. 自动化信息采集及监控程序(收集系统/应用状态信息,CPU,Mem,Disk,Net,TCP Status,Apache,MySQL)
  8. 配合Zabbix信息采集(收集系统/应用状态信息,CPU,Mem,Disk,Net,TCP Status,Apache,MySQL)
  9. 自动化扩容(增加云主机——>业务上线) zabbix监控CPU 80%+|-50% Python API AWS/EC2(增加/删除云主机) + Shell Script(业务上线)
  10. 俄罗斯方块,打印三角形,打印圣诞树,打印五角星,运行小火车,坦克大战,排序算法实现
  11. 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: [email protected] 
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 执行脚本前把脚本内容显示在屏幕上

你可能感兴趣的:(shell 第一天)