bash脚本进阶

case  变量引用  in
PAT1)分支1
;;
PAT2)  分支2
;;
*)
分支n
;;
esac
case支持glob风格的通配符:
  *:任意长度任意字符:
?:任意单个字符:
[ ]:指定范围内的任意单个字符:
a|b:a或b
function:函数
         过程式编程:代码重用
                模块化编程
     结构化编程
 
语法一:
function f_name { 
                …函数体…
}
语法二:
       f_name() {
   …函数体…
}
调用:函数只有被调用才会执行:
              调用:给定函数名
     函数名出现的地方,会被自动替换为函数代码:
             
              函数的生命周期:被调用时创建,返回时终止:
                    return命令返回自定义状态结果:
    0:成功
    1-255:失败
函数返回值:
函数的执行结果返回值:
(1)使用echo或print命令进行输出:
(2)函数体中调用命令的执行结果:
函数的推出状态码:
(1)默认取决于函数体中执行的最后一条命令的推出状态码:
(2)自定义退出状态码:
         return
函数可以接收参数:
传递参数给函数:调用函数时,在函数名后面以空白分割给定参数列表即可:例如“testfunc arg1 arg2 …”

在函数体当中,可使用$1,$2,….调用这些参数:还可以使用$@,$*,$#等特殊变量:


变量作用域:指的它的生效范围
                     本地变量:当前shell进程:为了执行脚本会启动专用的shell进程:因此,本地变量的作用范围是shell脚本程序文件:
局部变量:函数的生命周期:函数结束时变量被自动销毁
如果函数中有局部变量,其名称同本地变量:
在函数中定义局部变量的方法:
local NAME=VALUE
函数递归:
       函数直接或间接调用自身:
N!=N(n-1)(n-2)…1
1 1 2 3 5 8
vim fact.sh
#!/bin/bash
#
fact() {
     if [ $1 -eq 0 -o $1 -eq 1 ]; then
        echo 1
     else
        echo $[$1*$(fact $[$1-1])]
     fi
}
fact 5
练习:求n阶斐波那契数列:
#!/bin/bash
#
fab() {
if [ $1 -eq 1 ]; then
echo 1
elif [ $1 -eq 2 ]; then
echo 1
else
echo $[$(fab $[$1-1])+$(fab $[$1-2])]
}
fab 7
Systemd:
POST — > Boot Sequence –> Bootloader –> kernel + initramfs(initrd) –> rootfs –> /sbin/init
init:
       CentOS 5: SysV init
CentOS 6: Upstart
CentOS 7: Systemd
Systemd新特性:
系统引导时实现服务并行启动:
按需激活进程:
系统状态快照:
基于依赖关系定义服务控制逻辑:
核心概念:unit
        配置文件进行标识和配置:文件中主要包含了系统服务、监听socket、保存的系统快照以及其它与init相关的信息:保存至:
/usr/lib/systemd/system
/run/systemd/system
/etc/systemd/system
Unit的类型:
Service unit: 文件扩展名为.service,用于定义系统服务:
Target unit:文件扩展名为。target,用于模拟实现“运行级别”:
Device unit: .mount , 定义文件系统挂载点:
Socket unit:.socket ,用于标识进程间通信用的socket文件:
Swap unit :.swap , 用于标识swap设备:
Automount unit: .autoount,文件系统的自动挂载点:
Path unit :.path , 用于定义文件系统中的一个文件或目录:
关键特性:
基于socket的激活机制:socket与服务程序分离:
基于bus的激活机制:
基于device的激活机制:
基于path的激活机制:
系统快照:保存各unit的当前状态信息于持久存储设备中:
向后兼容sysv init脚本:
不兼容
systemctl命令固定不变
非由systemd启动的服务,systemctl无法与之通信
管理系统服务:
CentOS 7: service unit
注意:能兼容早期的服务版本
命令:systemctl COMMAND name.service
启动:service name start ==> systemctl start name.service
停止:service name stop ==> systemctl stop name.service
重启:service name restart ==> systemctl restart name.service
状态:service name status ==> systemctl status name.service
条件式重启:service name condrestart ==> systemctl  try-restart name.service
重载或重启服务:systemctl reload-or-restart name.service
重载或条件式重启服务:systemctl reload-or-try-restart name.service
禁止设定为开机自启:systemctl  mask name.service
取消禁止设定为开机自启:systemctl unmask name.service
查看某服务当前激活与否的状态:chkconfig –list name ==> systemctl is-active name.service
查看所有已经激活的服务:
systemctl list-units –type service
查看所有服务:
systemctl list-units –type service –all
学习linux主要后期都是实现服务管理类,所以这些服务管理类的命令要记清。
chkconfig命令的对应关系:
设定某服务开机自启:chkconfig name on ==> systemctl enable name.service
禁止:chkconfig name off ==> systemctl disable name.service
查看所有服务的开机自启状态
chkonfig –list ==> systemctl list-unit-files –type service
target units:
unit配置文件:.target
运行级别:
     0 ==> runlevel0.target,poweroff.target   这两种设定为关机
     1 ==> runlevel1.target,rescue.target       单用户模式
     2  ==> runlevel2.target,multi-user.target  
     3  ==> runlevel3.target,multi-user.target
     4  ==> runlevel4.target,multi-user.target
     5  ==> runlevel5.target,graphical.target    图形模式
     6  ==> runlevel6.target,reboot.target         重启模式
级别切换:
init N ==> systemctl isolate name.target
查看级别:
runlevel ==> systemctl list-units –type target
获取默认运行级别:
/etc/inittab ==> systemctl get-default
修改默认级别:
/etc/inittab ==> systemctl set-default name.target
切换至emergency模式:
systemctl emergency
其它常用命令:
关机:systemctl halt、systemctl poweroff
重启:systemctl reboot
挂起:systemctl suspend
快照:systemctl hibernate
快照并挂起:systemctl hybrid-sleep
回顾:bash脚本编程、systemd
函数:模块化编程
一种 : funtion f_name{
函数体…….
}
二种:f_name() {
函数体…..
}
return命令:
参数
函数体中调用参数:$1,$2,…函数名 参数列表
$*,$@,$#
向函数传递参数:
函数名 参数列表
systemd: 系统及服务
unit:
       类型:service,target
                 .service,.target
systemctl
bash脚本编程:
变量:存储单个元素的内存空间
数组:存储多个元素的连续的内存空间:
数组名
索引:编号从0开始:属于数值索引:
注意:索引也可支持使用自定义的格式,而不仅仅是数值格式:
bash的数组支持稀疏格式:
引用数组中的元素:${ARRAY_NAME[INDEX]}
声明数组:declare -a ARRAY_NAME
    declare -A ARRAY_NAME:关联数组
数组元素的赋值:
(1)一次只赋值一个元素:
ARRAY_NAME[INDEX]=VALUE
weekdays[0]=”Sunday”
weekdays[4]=”Thursday”
(2)一次赋值全部元素:
ARRAY_NAME=(“VAL1″”VAL2″”VAL3″…)
  (3)只赋值特定元素:
ARRAY_NAME=([0]=”VAL1″[3]=”VAL2 “…)
  (4)read -a ARRAY
引用数组元素:¥{ARRAY_NAME[INDEX]}
注意:省略[INDEX]表示引用下标为0的元素:
引用数组中的元素:
所有元素:¥{ARRAY[@]},${ARRAY[*]}
${ARRAY[@]:offset:number}
offset:要跳过的元素个数
number:要取出的元素个数,偏移量之后的所有元素${ARRAY[@]:offset}:
向数组中追加元素:
ARRAY[${#ARRAY[*]}]
删除数组中的某元素:
unset ARRAY[INDEX]
关联数组:
declare -A ARRAY_NAME
ARRAY_NAME=([index_name1])=’val1′ [index_name2]=’val2′ …)
练习:生成10个随机数,升序或降序排序:
bash的字符串处理工具:
字符串切片:
        ${var:offset:number}
        取字符串的最右侧几个字符:${var: -lengh}
                       注意:冒号后必须有一空白字符:
基于模式取子串:
${var#*word}:其中word可以是指定的任意字符:功能:自左而右,查找var变量所存储的字符串中,第一次出现的word,删除字符串开头至第一次出现word字符之间的所有字符:
${var##*word}:同上,不过,删除的是字符串开头至最后一次由word指定的字符之间的所有内容:
${var%word*}:其中word可以是指定的任意字符:功能:自右而左,查找var之间的所有字符:变量所存储的字符串中,第一次出现的word,删除字符串最后一个字符向左至第一次出现word字符
file=”/var/log/messages”
${file%/*}:/var/log
${var%%word*}:同上,只不过删除字符串最右侧的字符向左最后一次出现word字符之间的所有字符:
       示例:
url=http://www.magedu.com:80
     ${url##*:}
     ${url%%:*}
查找替换:
${var/pattern/substi}:查找var所表示的字符串中,第一次被pattern所匹配到的字符串,以substi替换之:
${var//pattern/substi}:查找var所表示的字符串中,所有能被pattern所匹配到的字符串,以substi替换之:
${var/#pattern/substi}:查找var所表示的字符串中,第一次被pattern所匹配到的字符串,以substi替换之:
${var/%pattern/substi}:查找var所表示的字符串中,行尾被pattern所匹配到的字符串,以substi替换之:
查找并删除:
${var/pattern}:查找var所表示的字符串中,删除第一次被pattern所匹配到的字符串
${var//pattern}:查找var所表示的字符串中,删除所有被pattern所匹配到的字符串
字符大小写转换:
       ${var^^}:把var中的所有小写字母转换为大写:
${var,,}:把var中的所有大写字母转换为小写:
变量赋值
${var:-value}:如果var为空或未设置,那么返回value:否则,则返回var的值:
{var:=value}:如果var为空或未设置,那么返回value,并将value的值赋值给var:否则,则返回var的值:
${var:+value}:如果var不空,则返回value:否则,则返回var的值:
${var:?error_info}:如果var为空或未设置,那么返回error_info:否则,则返回var的值:
为脚本程序配置文件:
(1)定义文本文件,每行定义“name=value
(2)在脚本中source此文件即可
命令:
mktemp命令:
mktemp [OPTION]…[TEMPLATE]
TEMPLATE:filename.XXX
XXX.至少要出现三个:
OPTION:
-d:创建临时目录:
–tmpdir=/PATH/TO/SOMEDIR:指明临时文件目录位置:
install命令:
install [OPTION]… [-T] SOURCE DEST
install [OPTION]… SOURCE…  DIRECTORY
install [OPTION]… -t DIRECTORY SOURCE
install [OPTION]… -d DIRECTORY…
选项:
-m MODE
-o OWNER
-G GROUP

原创文章,作者:wangjunsheng,如若转载,请注明出处:http://www.178linux.com/76657

(2)
wangjunshengwangjunsheng
上一篇 2017-05-21
下一篇 2017-05-21

相关推荐

  • 对防火墙的初步认识

      防火墙,就是用于实现Linux下访问控制的功能的,它分为硬件的或者软件的防火墙两种。无论是在哪个网络中,防火墙工作的地方一定是在网络的边缘。而我们的任务就是需要去定义到底防火墙如何工作,这就是防火墙的策略,规则,以达到让它对出入网络的IP、数据进行检测。    目前市面上比较常见的有3、4层的防火墙,叫网络层的防火墙,还有7…

    Linux干货 2017-06-15
  • 马哥教育网络班21期-第八周课程练习

    第八周作业 1、请描述网桥、集线器、二层交换机、三层交换机、路由器的功能、使用场景与区别。 集线器:集线器工作在OSI七层模型的物理层;功能是将传输信号再生或放大,收到数据后将数据转发至除接收接口外的所有接口(广播)),但是由于集线器所有端口属于共享带宽,属于同一个冲突域和属于同一个广播域,容易产生信号冲突导致帧碎片,现今大部分集线器已经被交换机所替代; 网…

    Linux干货 2016-09-01
  • gzip压缩算法

    gzip,zlib,以及图形格式png,使用的是同一个压缩算法deflate。我们通过对gzip源码的分析来对deflate压缩算法做一个详细的说明: 第一,gzip压缩算法基本原理的说明。 第二,gzip压缩算法实现方法的说明。 第三,gzip实现源码级的说明。 1. Gzip压缩算法的原理      &n…

    Linux干货 2015-07-30
  • linux第一天,不正经的感想

    课是正经课,人正不正经就不知道了

    2018-03-26
  • find文件:就是这么简单

    概述 由于Linux一切皆文件,我们的日常运维工作其实就是与文件打交道的事,如何能够快速而有效地找到我们需要的文件呢?这是个令人头疼的问题。幸运是,Linux为用户提供了强大的查找工具——find。find通过遍历指定路径完成文件查找,它的的工作特点: 精确查找——多查询条件组合,精确匹配; 实时查找——遍历指定路径; 查找速度稍慢——由于需要遍历路径,速度…

    Linux干货 2016-08-18
  • Linux基础学习总结(一)

    Linux 安装运行步骤: 进入\\172.16.0.1\python10          用户名:python10          密码:python10magedu 进入目录   ftp://172.16.0.1/pub/ISOs/ 下载linux系统镜像文件           CentOS-6.9-x86_64-bin-DVD1.iso     …

    Linux干货 2018-03-16