shell初级部分总结

shell是linux提供的基础可程序化语言,shell内核处理起来更加高效;高级语言python等是用来处理复杂的业务逻辑;对于服务器管理,进程以及硬件的管理shell更加适合,因为shell就是帮助我们翻译命令行的;

什么是shell

命令解释器,用于解释用户对操作系统的操作,shell有很多(cat /etc/shells);

shell能做什么

  1. 基础配置:系统初始化操作、系统更新、内核调整、网络、时区、SSH优化

  2. 安装程序:部署LNMP、LAMP、MySQL、Nginx、Redis等等

  3. 配置变更: Nginx Conf、PHP Conf、MySQL Conf、Redis Conf

  4. 业务部署: Shell配合git、jenkins实现自动化部署php、java代码,以及代码回滚 秒级回退,就是做一个软连接,从新生成一个软连接,就能快速回滚!

  5. 日常备份:使用shell脚本对MySQL进行每晚的全备和增量备份 **

  6. 信息采集:Zabbix +shell ,硬件、系统、服务、网络等等 **

  7. 日志分析:取值-》排序-》去重-》统计-》分析

  8. 日志扩容:扩容:监控服务器集群cpu,如CPU负载持续80%+触发动作(脚本);

其实有了ansible更好;ansible是同时下发指令给所有机器执行,不像shell串行执行!

shell变量定义的方式

  1. 用户自定义变量:人为定义变量名称。当前shell有效;

    var="hello wrold" #两边不要有空格当前shell临时有效;子shell,同级shell都无法使用(export才可以)
  2. 系统环境变量:保存的是和系统操作环境相关的数据。

    当前shell,子shell所有的shell都有效[root@lixi ~]# export  # 里面的都是系统提供的变量$HOSTNAME,$PWD,$SHELL,$USER​系统提供的不够用,自定义#自定义系统变量[root@lixi ~]# export var2=hello  #将变量转为环境变量  (临时生效,永久就在/etc/profile)这样  子shell,任何shell都可以使用了   ***************
  3. 位置参数变量:向脚本中进行参数传递,变量名不能自定义,变量作用是固定的。

    $0 当前进程的名字$1 第一个位置参数,$ 2 3 5 ....$$ 当前程序运行的PID$? 上一个命令执行结果$# 传递参数的个数$! $* $@ 不加引号时候,上下两个都表示一样的结果,就是所有传入的参数(可遍历);​​$100  #没有传递的参数为空;不会报错!命令嵌套​$(tar czf root.tar.gz $(find /root/ -name *.txt))​
  4. 预定义的变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的。

shell子串

${#}  #从头开始匹配,最短删除;所以*表示前面要删的字符${##} #从头开始匹配,最短删除${%}  #从后往前匹配,最短删除;所以*表示后面要删的字符${%%} #从后往前匹配,最长删除;​[root@web01 ~]# url=www.sina.com.cn​!!!!!!!!!!!硬要注意*星号的位置[root@web01 ~]# echo ${url#*.}  sina.com.cn  #从前完后匹配,一直匹配到点'.';所以*就是www[root@web01 ~]# echo ${url##*.}cn #因为是最长匹配,所以匹配到了最后一个点​​[root@web01 ~]# echo ${url%.*}www.sina.com  #从后往前匹配,所以*表示cn[root@web01 ~]# echo ${url%%.*}www​[root@web01 ~]# echo ${url%.com*} #这样也可以www.sina

系统自带的shell

1)用户系统的启动过程 2)linux命令,(有些也是通过shell脚本实现的)

linux启动过程:BIOS(主板上的系统)–>MBR(硬盘的主引导分区512)–>BootLoader(grub;进入linux过程了,启动和引导内核,确定内核版本的工具,还可以引导window启动)—>kernel —->systemd(1号进程) —>系统初始化—–>shell

centos6的一号进程是init.d centos7是systemd; cents6中在1号进程之后都是shell脚本去完成的;centos7一部分改了systectl去启动配置文件了;

查看这些脚本​MBR:    dd if=/dev/sda of=mbr.bin bs=446 cont 1  #MBR主引导记录    dd if=/dev/sda of=mbr.bin bs=512 cont 1  #包含磁盘分区表    hexdump -C mbr.bin    最后一个55 aa 标记为,表示引导扇区是正确的,然后把权限交给grubgrub:    cat /boot/grub2/grub.cfg    groub-editenv list #查看默认内核    uanem -r   #查看当前使用的内核

编写脚本

就是将多条命令组合在一起,做一件事

shebang:如果你将传递给了其他人,其他人的shell不是bash,但是脚本中又用了bash一些特性,那么别人运行就会出错!

./1.sh #./使用的是当前系统的$BASH去执行,遇到shebang就用定义的shell去执行;

  1. 内建命令不会创建子进程(cd,pwd等等),外部命令才会创建子进程,所以内建命令能改变当前shell的环境

  2. 如果使用bash生成了一个新的子进程,那么内置命令会对新产生这个子进程生效,一旦你在子进程使用了exit回到了父进程之后,子进程里执行的内部命令就无效了

所以执行shell的时候需要注意,脚本是否对需要对当前运行环境产生影响,如果需要就用source 和.执行;如果不希望对当前环境产生影响就是用./ 和/bin/bash即可

子shell会继承父shell的有效权限,如果父shell的有效用户是root,那么子shell的有效用户也是root;

管道与重定向

管道:是进程通信的工具,在shell中主要是方便脚本中两条命令通信;把一个命令的标准输出作为下一个命令的标准输入

重定向:将标准输出到一个文件中,或者文件的输入

  • 管道与管道符 管道和信号一样,也是进程通信的方式之一;匿名管道(管道符)是Shell 编程经常用到的通信工具,管道符是“I”,将前一个命令执行的结果传递给后面的命令

    ps | cat   echo 123 | ps管道符的作用1)将一个命令的输出当做另一个命令的输入2)给两个边的进程创建了相应的子进程[root@lianxi ~]# cat | ps -f   #cat和ps都是外部命令UID         PID   PPID  C STIME TTY          TIME CMDroot       1420   1418  0 02:02 pts/0    00:00:00 -bashroot       1849   1420  0 07:46 pts/0    00:00:00 catroot       1850   1420  0 07:46 pts/0    00:00:00 ps -fcat夯住了,等待当前pts的输入,手动输入字符后cat也会执行完成;​再开一个窗口[root@lianxi ~]# cd /proc/1849/fd[root@lianxi fd]# ls -ltotal 0lrwx------ 1 root root 64 Oct  8 07:59 0 -> /dev/pts/0  #标准输入,你在哪个终端执行的命令l-wx------ 1 root root 64 Oct  8 07:59 1 -> pipe:[44238] #标准输出到管道符lrwx------ 1 root root 64 Oct  8 07:58 2 -> /dev/pts/0​[root@lianxi ~]# cd /proc/1850/fd-bash: cd: /proc/1850/fd: No such file or directory因为ps -f执行完就消失了,所以没有这个目录​​如果两个命令都是长期输入的,就会发现第二条命令的 0 ->也是指向pipe:[44238] ,这样就把第一个命令的输出和第二个命令的输入做了一个连接;​;分号,就是隔开符号,第一个和第二个命令互不影响;

    管道也是通过子进程方式去进行的,如果用了cd,pwd这样的内建命令你当前的父进程是得不到想要的结果的;所以管道符里面使用内建命令,就需要写入到封装好的shell脚本里面,让他作用在shell脚本之内,离开了脚本也没用了;除非必要,一般不在管道符两边使用内建命令;

  • 子shell与子进程

    如果子进程是一个shell脚本,那么shell脚本称为子shell;

  • 重定向符号

重定向

所有的进程都会打开标准输入\输出\错误输出,重定向就是将文件和他们进行连接;

标准输入:键盘,终端和文件,输入重定向就是利用文件代替键盘的输入

[root@lianxi ~]# cat 1.txt  123      #不管多少行,第一行才作为键盘的输入345[root@lianxi ~]# read a < 1.txt #文件代替键盘的输入[root@lianxi ~]# echo $a123​[root@lianxi ~]# wc -l < 1.sh

标准\错误输出:屏幕,终端和文件,输出重定向就是将输出写入文件;默认是输出到终端

>,>>,2>(错误输出),&>(正确和错误都输出到一个文件中)[root@lianxi ~]# ls 2>1.c   #只有错误才写入文件,正确的直接默认输出终端

请登录后发表评论

    没有回复内容