阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Linux基础教程之bash脚本进阶

350次阅读
没有评论

共计 5864 个字符,预计需要花费 15 分钟才能阅读完成。

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
正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-12-03发表,共计5864字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19351
评论数
4
阅读量
7976473
文章搜索
热门文章
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见 zabbix!轻量级自建服务器监控神器在 Linux 的完整部署指南 在日常运维中,服务器监控是绕不开的...
飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛 NAS 中安装 Navidrome 音乐文件中文标签乱码问题解决、安装 FntermX 终端 问题背景 ...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
如何免费使用强大的Nano Banana Pro?附赠邪修的用法

如何免费使用强大的Nano Banana Pro?附赠邪修的用法

如何免费使用强大的 Nano Banana Pro?附赠邪修的用法 前言 大家好,我是星哥,今天来介绍谷歌的 ...
星哥带你玩飞牛NAS-2:飞牛配置RAID磁盘阵列

星哥带你玩飞牛NAS-2:飞牛配置RAID磁盘阵列

星哥带你玩飞牛 NAS-2:飞牛配置 RAID 磁盘阵列 前言 大家好,我是星哥之前星哥写了《星哥带你玩飞牛 ...
免费无广告!这款跨平台AI RSS阅读器,拯救你的信息焦虑

免费无广告!这款跨平台AI RSS阅读器,拯救你的信息焦虑

  免费无广告!这款跨平台 AI RSS 阅读器,拯救你的信息焦虑 在算法推荐主导信息流的时代,我们...
如何安装2026年最强个人助理ClawdBot、完整安装教程

如何安装2026年最强个人助理ClawdBot、完整安装教程

如何安装 2026 年最强个人助理 ClawdBot、完整安装教程 一、前言 学不完,根本学不完!近期,一款名...
飞牛NAS玩转Frpc并且配置,随时随地直连你的私有云

飞牛NAS玩转Frpc并且配置,随时随地直连你的私有云

飞牛 NAS 玩转 Frpc 并且配置,随时随地直连你的私有云 大家好,我是星哥,最近在玩飞牛 NAS。 在数...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
安装Black群晖DSM7.2系统安装教程(在Vmware虚拟机中、实体机均可)!

安装Black群晖DSM7.2系统安装教程(在Vmware虚拟机中、实体机均可)!

安装 Black 群晖 DSM7.2 系统安装教程(在 Vmware 虚拟机中、实体机均可)! 前言 大家好,...
星哥带你玩飞牛NAS-14:解锁公网自由!Lucky功能工具安装使用保姆级教程

星哥带你玩飞牛NAS-14:解锁公网自由!Lucky功能工具安装使用保姆级教程

星哥带你玩飞牛 NAS-14:解锁公网自由!Lucky 功能工具安装使用保姆级教程 作为 NAS 玩家,咱们最...
星哥带你玩飞牛NAS-13:自动追番、订阅下载 + 刮削,动漫党彻底解放双手!

星哥带你玩飞牛NAS-13:自动追番、订阅下载 + 刮削,动漫党彻底解放双手!

星哥带你玩飞牛 NAS-13:自动追番、订阅下载 + 刮削,动漫党彻底解放双手! 作为动漫爱好者,你是否还在为...
多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞定

多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞定

多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞...
星哥带你玩飞牛NAS硬件 01:捡垃圾的最爱双盘,暴风二期矿渣为何成不老神话?

星哥带你玩飞牛NAS硬件 01:捡垃圾的最爱双盘,暴风二期矿渣为何成不老神话?

星哥带你玩飞牛 NAS 硬件 01:捡垃圾的最爱双盘,暴风二期矿渣为何成不老神话? 前言 在选择 NAS 用预...