8、shell 脚本

news/发布时间2024/5/4 4:07:39

1.shell 脚本基础

作用:介于系统内核与用户之间,负责解释命令行

1.1.第一个 shell 脚本

vim first.sh

cd /boot/
pwd
ls -lh vml*z

赋予可执行权限:chmod +x firest.sh

执行脚本方式(三种)

./first.shsh /first.shsource /first.sh

完善脚本构成:脚本声明;注释信息;可执行语句

vim /first.sh

#!/bin/bash
# This is my first Shell-Script.
cd /boot
echo "当前的目录位于:"
pwd
echo "其中以 vml 开头的文件包括:"
ls -lh vml*

1.2.重定向与管道操作

交互式硬件设备

  标准输入:从该设备接收用户输入的数据

  标准输出:通过该设备向用户输出数据

  标准错误:通过该设备报告执行出错信息

 重定向操作

 管道符:将左侧的命令输出结果,作为右侧命令的处理对象

1.3.变量

类型:

  自定义变量

  环境变量:用于设置工作环境

  位置变量:通过命令行给脚本程序传递参数

  预定义变量:Bash 中内置的一类变量,不能直接修改

赋值时使用引号:

  双引号:允许通过 $ 符号引用其他变量值

  单引号:禁止引用其他变量值,$ 视为普通字符

  反引号:命令替换,提取命令执行后的输出结果

从键盘输入内容为变量赋值:

read [-p "提示内容"] 变量名

常用运算符:

+、-、\*、/、%(求模、取余运算)

环境变量:

配置文件:/etc/profile、~/.bash_profile

常见环境变量:

  PWD、PATH、USER、SHELL、HOME

位置变量:

表示为 $n(n为 1-9 的数字)

 预定义变量:

$#:命令行中位置变量的个数
$*:所有位置变量的内容
$?:上一条命令执行后返回的状态,当返回状态值为 0 时表示执行正常,非 0 值表示执行异常或出错
$0:当前执行的进程/程序名

 1.4.一键搭建 dhcp 服务

vim /root/install-dhcp.sh

#!/bin/bash
umount /dev/sr0
mount /dev/sr0 /media
rm -rf /etc/yum.repos.d/*
echo "[test-sh]" >> /etc/yum.repos.d/test.repo
echo "name=test" >> /etc/yum.repos.d/test.repo
echo "baseurl=file:///media" >> /etc/yum.repos.d/test.repo
echo "enable=1" >> /etc/yum.repos.d/test.repo
echo "gpgcheck=0" >> /ect/yum.repos.d/test.repo
yum -y install dhcp*

read -p "subnet:" NET
read -p "network:" MASK
read -p "range:" RANGE
read -p "dns1:" DNS1
read -p "dns2:" DNS2
read -p "gateway:" GATE
read -p "broadcast:" BROA
echo "subnet $NET netmask $MASK {" > /etc/dhcp/dhcpd.conf
echo "range $RANGE;" >> /etc/dhcp/dhcpd.conf #指定IP地址范围
echo "option domain-name-servers $DNS1,$DNS2;" >> /etc/dhcp/dhcpd.conf
echo 'option domain-name "internal.example.org";' >> /etc/dhcp/dhcpd.conf
echo "option routes $GATE;" >> /etc/dhcp/dhcpd.conf
echo "option broadcast-address $BROA;" >> /etc/dhcp/dhcpd.conf
echo "default-lease-time 600;" >> /etc/dhcp/dhcpd.conf
echo "max-lease-time 7200;" >> /etc/dhcp/dhcpd.conf
echo "}" >> /etc/dhcp/dhcpd.conf
systemctl start dhcpd

1.5.test 命令

测试特定的表达式是否成立,当条件成立时,测试语句的返回值为 0,否则为其他数值

格式1:test 条件表达式

格式2:[ 条件表达式 ](至少应该有一个空格)

文件测试

[ 操作符 文件或目录 ]

常用测试操作符:

-d:测试是否为目录(Directory)
-e:测试目录或文件是否存在(Exist)
-f:测试是否为文件(File)
-r:测试当前用户是否有权限读取(Read)
-w:测试当前用户是否有权限写入(Write)
-x:测试当前用户是否有权限执行(excute)

[ -d /media/cdrom ]

echo $?(返回 0 表示条件成立,否则不成立)

[ -d /media/cdrom ] && echo "YES"

1.6.整数值比较

[ 整数1 操作符 整数2 ]

-eq:等于
-ne:不等于
-gt:大于
-lt:小于
-ge:大于或等于
-le:小于或等于

1.7.字符串比较

格式1:[ 字符串1 = 字符串2 ] 或者 [字符串1 != 字符串2 ]

格式2:[ -z 字符串 ]

=:字符串内容相同
!=:字符串内容不同
-z:字符串内容为空

2.shell 脚本分支语法

2.1.if 语句

if 条件测试操作then 命令序列
elif 条件判断
then 命令序列
else
命令执行语句 fi

3.shell 脚本循环语法

3.1.while 循环

while 条件测试操作
do命令序列
done

3.2.for 循环

for 变量名 in 取值列表
do命令序列
done

3.3.case 语句

case 变量值 in
模式1)命令序列1;;
模式2)命令序列2;;
*)默认命令序列
esac

4.正则表达式使用

4.1.正则表达式组成

普通字符:大小写字母、数字、标点符号及其他一些符号

元字符:在正则表达式中具有特殊意义的专用字符

常见元字符:

^:开头
$:结尾
.:单个任意字符
\:使右侧正则符号失去含义,变为字符
*:匹配左侧表达式 0 次到任意次
[]:范围选择匹配符,匹配的信息不再是任意,由 [] 内信息决定
{}:匹配左侧表达式的个数,在 shell 中需要转义:\{\}
{n}:匹配左侧表达式 n 个
{n,}:匹配左侧表达式 n 个到任意个
{n,m}:匹配左侧表达式 n 个到 m 个(最少 n 个,最多 m 个)

IP地址正则:[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}

扩展
+:匹配左侧表达式一个或多个
?:匹配零个或一个
|:多个信息中匹配某一个
():查找 “组” 字符串
()+:辨别多个重复的组

\t:表示横向制表符,tab 大空格
\n:换行符

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ulsteruni.cn/article/77653583.html

如若内容造成侵权/违法违规/事实不符,请联系编程大学网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

汇编语言简易教程(10):宏

介绍了汇编语言中的宏,包括单行宏和多行宏的定义和使用方式。单行宏可简化代码,例如将寄存器内容乘以4;多行宏可以包含不同数量的行,通过%汇编语言简易教程(10):宏汇编语言宏是一组预定义的指令,可以轻松插入到需要的地方。 一旦定义,宏可以根据需要多次使用。当必须多次…

sql server

还原报错:备份集中的数据库备份与现有的 数据库不同 解决: 1.删除新建的那个数据库。 2.将备份好的数据库文件放到备份的目录中。不知道路径,在下图5那边可以看到路径。 3.按图操作。

沙漠玫瑰

神十七乘组镜头里的地球家园让你的微笑和悲伤成为我这一生的刻痕。——夕阳的刻痕

11111111111

近日,广州地铁十四号线二期完成多项施工节点:国内首个采用盾构法施工的出入口通道顺利贯通、在建所有区间开始盾构施工、马务站成功实现封顶,截至目前土建工程完成56%。 马务站基坑开挖。 国内首个采用盾构法施工的出入口通道贯通 地铁14号线二期彭边站C出入口通道是国内首个…

Godot UI线程,Task异步和消息弹窗通知

目录前言线程安全全局消息IOC注入消息窗口搭建最简单的消息提示简单使用仿Element UIElementUI 效果简单的Label样式如何快速加载多个相同节点修改一下,IOC按钮事件注册总结 前言 最近我在研究Godot的全局消息,然后发现Godot 也是有UI线程限制的,只能在主线程的子线程里面修…

java中cron表达式 每10分钟执行一次

在Java中,可以使用Quartz框架来定义和调度任务,包括使用Cron表达式来定义任务的执行时间。下面是一个使用Quartz框架实现每10分钟执行一次任务的示例: 添加Quartz依赖 在Maven项目中,添加以下依赖到pom.xml文件中: <dependency><groupId>org.quartz-scheduler…