订阅本站
收藏本站
微博分享
QQ空间分享

bash脚本进阶

alen 分类:Linux入门 时间:2018/12/21 22:16:42 浏览: 评论: 加入收藏
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

TAG:

文章评论

留言与评论(共有 0 条评论)
   
验证码: