Shell编程
2021-11-11 23:16:29   0  举报             
     
         
 AI智能生成
  Shell编程概述、Shell基础入门、Shell高级进阶、系统任务设置、定时任务、虚拟机互传免密钥、执行脚本初始化
    作者其他创作
 大纲/内容
  Shell编程概述    
     Kernel    
     Linux内核主要是为了和硬件打交道  
     Shell    
     命令解释器  
     描述    
     Shell是一个用C语言编写,它是用户使用Linux的桥梁  
     注意    
     Shell既是一种命令语言,优势一种程序语言  
     Shell是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核服务  
     图文    
     分支主题  
     Shell两大主流    
     分类    
     sh    
     Bourne shell(sh) ,Solaris,hpux默认shell  
     Bourne again shell(bash) ,Linux系统默认shell  
     csh    
     C shell(csh)  
     tc shell(tcsh)  
     图文    
     分支主题  
     #!声明    
     告诉系统其后路径所指定的程序即是解释此脚本的Shell程序  
     #! /bin/bash
echo "Hello World !"  
     Shell脚本执行    
     执行方式    
     输入脚本的绝对路径或相对路径    
     /root/helloworld.sh  
     ./helloworld.sh  
     执行的必须是一个可执行文件  
     bash或sh + 脚本    
     sh helloworld.sh  
     当脚本没有x权限时,root和文件所有者通过该方式可以正常执行  
     在脚本的路径前面再加“.” 或 source    
     source helloworld.sh  
     执行方式图文展示    
     分支主题  
     区别    
     第一种和第二种会新开一个bash,不同bash种的变量无法共享  
     第三种 实在同一个Shell里面执行的  
     export    
     描述    
     可以将当前进程的变量传递给子进程去使用  
     将来配置profile的时候,所有的变量前面必须加export  
     图文    
     分支主题  
     注意    
     当参数被多次赋值时,采用就近原则  
     Shell基础入门    
     Shell变量    
     定义变量时,变量名不加美元符号    
     命令只能使用英文字母,数字和下划线,首个字符不能以数字开头  
     中间不能有空格,可以使用下滑线(_)  
     不能使用标点符号  
     不能使用bash里面的关键字(可用help命令查看保留关键字)  
     变量的类型    
     局部变量    
     局部变量在脚本命令种定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量  
     环境变量    
     所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行  
     Shell变量    
     shell变量是由shell程序设置的特殊变量,shell变量中有一部分是环境变量,有一部分是局部变量  
     常见问题    
     图文    
     分支主题  
     注意    
     单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的  
     操作    
     变量的声明    
     name="zhangsan"  
     变量的调用    
     $name  
     只读变量    
     readonly url  
     删除变量    
     unset name  
     Shell的字符串    
     说明    
     字符串是shell编程中最常用数据类型  
     字符串可以用单引号,可以用双引号,也可以不用引号  
     单引号    
     单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的  
     单引号字符串中不能出现单独一个的单引号,但可成对出现,作为字符串拼接使用  
     双引号    
     双引号里可以由变量  
     双引号里可以出现转义字符  
     操作    
     声明字符串  
     字符串拼接--双引号    
     "$name"  
     ${name}  
     两格式可传参  
     字符串拼接--单引号    
      '$passwd'  
     传参类型  
     字符串的长度    
     ${#email}    
     返回变量长度  
     ${email:1:4}    
     切片,截取索引1~4为,0开始  
     Shell数组    
     注意    
     bash支持一维数组(不支持多维数组),并且没有限定数组的大小  
     数组元素的下标由0开始编号。  
     获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0  
     操作    
     定义数组    
     注意    
     括号来表示数组,数组元素用“空格“符号分隔开  
     格式    
     数组名=(值1 值2 .....值n)  
     实例    
     arr1=("a" "b" "c" "d")  
     读取数组    
     格式    
     ${数组名[下标]}  
     实例    
     reada=${arr1[1]}    
     b  
     使用 @ 符号可以获取数组中的所有元素    
     echo ${#arr1[@]}    
     4  
     获取数组长度    
     length1=${#arr1[@]}     
     4  
     length2=${#arr1[*]}    
     4  
     Shell的注释    
     注意    
     以 # 开头的行就是注释,会被解释器忽略  
     通过每一行加上一个 # 号设置多行注释  
     多行注释    
     <<eof 
1.多行注释?
eof  
     <<!
2.多行注释
!  
     Shell参数传递    
     说明    
     执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字  
     图文    
     分支主题  
     实例    
     内容  
     结果    
     sh args.txt  11 22 33 44  
     Shell高级进阶    
     Shell运算符    
     算数运算符    
     描述    
     expr 是一款表达式计算工具,使用它能完成表达式的求值操作。  
     实例  
     图文参数    
     分支主题  
     关系运算符    
     描述    
     关系运算符只支持数字,不支持字符串,除非字符串的值是数字  
     图文参数    
     分支主题  
     实例  
     布尔运算符    
     图文参数    
     分支主题  
     实例  
     逻辑运算符    
     实例  
     字符串运算符    
     实例  
     图文参数    
     分支主题  
     文件测试运算符    
     描述  
     图文参数    
     分支主题  
     实例  
     echo打印数据    
     描述    
     Shell 的 echo 指令用于字符串的输出  
     操作    
     显示普通字符串    
     echo "Hello World"  
     显示转义字符    
     echo "\"Hello World\""  
      显示变量    
     name="zhangsan" 
echo "$name Hello World"  
     显示换行    
     echo -e "OK! \n" 
echo "Hello World"  
     显示不换行    
     echo -e "OK! \c" 
echo "Hello World"  
     显示结果定向至文件    
     echo "Hello World" > myfile  
     原样输出字符串    
     echo '$name\"'  
     显示命令执行结果    
     echo `date`  
     test命令    
     描述    
     Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。  
     分类    
     数字    
     图文           
     字符串    
     图文           
     文件测试    
     图文           
     实例  
     Shell流程控制    
     if    
     描述    
     条件判断语句  
     格式    
     分支主题  
     实例    
     分支主题  
     case    
     描述    
     Shell case 语句为多选择语句,可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。  
     格式    
     分支主题  
     实例    
     分支主题  
     for    
     描述    
     当变量值在列表里,for循环即执行一次所有命令,使用变量名获取列表中的当前取值  
     命令可为任何有效的shell命令和语句,in列表可以包含替换、字符串和文件名  
     in列表是可选的,如果不用它,for循环使用命令行的位置参数  
     格式    
     分支主题  
     实例    
     分支主题  
     while循环    
     描述    
     while循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件。  
     格式    
     分支主题  
     实例    
     分支主题  
     break    
     描述    
     break命令允许跳出所有循环(终止执行后面的所有循环)  
     实例    
     分支主题  
     continue    
     描述    
     continue命令不会跳出所有循环,仅仅跳出当前循环  
     实例    
     分支主题  
     Shell函数    
     描述    
     linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。  
     可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。  
     参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255  
     实例  
     系统任务设置    
     系统启动流程    
     1、启动计算机的硬件(BIOS)    
     读取时间  
     选择对应的启动模式(USB HDD EFI)  
     2、如果是Linux系统,回去找/boot目录.引导这个系统启动  
     3、计算机系统开始启动,读取初始化配置文件    
     vim /etc/inittab  
     启动时控制着计算机的运行级别 runlevel  
     运行级别图文    
     分支主题  
     id:3:initdefault: 默认runlevel为3   
     以runlevel=3开始启动对应的服务和组件  
     4、开始默认引导公共的组件或者服务    
     vim /etc/rc.d/rc.sysinit  
     5、开始加载对应runlevel的服务    
     vi /etc/rc3.d/    
     K:关机时需要关闭的服务  
     S:启动时需要开启的服务  
     数字代表了开启或者关闭的顺序  
     所有的文件都是软链接,链接的地址为 /etc/init.d  
     6、当启动完毕,所有的服务也被加载完成  
     运行流程图文展示    
     分支主题  
     系统服务    
     我们可以使用chkconfig命令查看当前虚拟机的服务  
     通过查看可以得知不同的级别对应到每一个服务确定本次开机自动启动  
     开机结束后,我们需要使用service(Centos6)Systemctl(Centos7)命令控制服务的开启或者关闭  
     开机自启动服务    
     方式    
     方法一:rc.local    
     1、首先创建脚本存放的文件夹    
     mkdir -p /usr/local/scripts  
     2、在文件夹中创建脚本文件    
     vim hello.sh  
     给予执行权限    
     u+x  
     3、去/etc/rc.d/rc.local文件中添加脚本的绝对路径    
     sh /usr/local/scripts/hello.sh  
     给予rc.local执行权限    
     u+x  
     4、重启虚拟机    
     reboot  
     方法二:chkconfig    
     1、创建开机自启动脚本文件    
     vim schoolntpdate.sh    
     #!/bin/bash 
#chkconfig: 2345 88 99 
#description:auto_run  
     2、给其设置执行权限    
     chmod u+x schoolntpdate.sh  
     3、将脚本拷贝到 /etc/init.d目录下    
     cp schoolntpdate.sh /etc/init.d/  
     4、添加到服务    
     chkconfig --add /etc/init.d/schoolntpdate.sh  
     5、重启服务器    
     reboot  
     图文展示    
     分支主题  
     定时任务    
     编辑任务    
     格式    
     * * * * * command  
     分 时 日 月 周 命令  
     参数    
     参数一    
     第1列表示分钟0~59 每分钟用*或者 */2表示  
     第2列表示小时0~23(0表示0点)  
     第3列表示日期1~31  
     第4列表示月份1~12  
     第5列标识号星期0~6(0表示星期天)  
     第6列要运行的命令  
     参数二    
     *:表示任意时间都,实际上就是“每”的意思。可以代表00-23小时或者00-12每月或者00-59  
     分-:表示区间,是一个范围,00 17-19 * * * cmd,就是每天17,18,19点的整点执行命令  
     ,:是分割时段,30 3,19,21 * * * cmd,就是每天凌晨3和晚上19,21点的半点时刻执行命令  
     /n:表示分割,可以看成除法,*/5 * * * * cmd,每隔五分钟执行一次  
     实例  
     运行    
     1、在系统服务中心,crond负责周期任务    
     systemctl status crond.service  
     2、添加任务,编辑当前用户的任务列表    
     crontab -e  
     3、编辑任务  
     4、重启crontab,使配置生效    
     systemctl restart crond.service  
     5、通过crontab -l    
     查看当前的定时任务  
     6、查看任务的历史    
     vim /var/spool/mail/root  
     7、清除任务    
     crontab -r  
     图文展示    
     分支主题  
     虚拟机互传免密钥    
     流程    
     1、三台主机分别生成秘钥    
     【123】vim /etc/ssh/ssh_config 在最后添加    
     StrictHostKeyChecking no UserKnownHostsFile /dev/null  
     2、将秘钥分别拷贝给自己和别人    
     【123】ssh-copy-id -i ~/.ssh/id_rsa.pub root@node01 
【123】ssh-copy-id -i ~/.ssh/id_rsa.pub root@node02 
【123】ssh-copy-id -i ~/.ssh/id_rsa.pub root@node03  
     123456  
     3、关闭主机拍摄快照    
     power off  
     执行脚本初始化    
     1.上传配置文件及脚本  
     2、在windows编译的脚本配置,可能在Linux中会有异常(两者编码方式略有不同)    
     异常    
     -bash: ./bdp.sh: /bin/bash^M: bad interpreter: No such file or directory  
     解决方法    
     vim或者vi的命令模式下,输入命令    
     set fileformat=unix  
     克隆后初始化    
     改主机名    
     vim /etc/hostname  
     改主机ip    
     vim /etc/sysconfig/network-scripts/ifcfg-ens33  
     自由主题  
    
 
 
 
 
  0 条评论
 下一页