2024.7.26(shell脚本)

一、shell基础

1、shell 概念

shell英文翻译过来是外壳的意思,作为计算机语言来理解可以认为它是操作系统的外壳。可以通过shell命令来操作和控制操作系统,比如Linux中的shell命令就包括Is、cd、pwd等等。

shell 在内核的基础上编写的一个应用程序,它连接了用户和Linux内核,从而让用户能够更加便捷、高效、安全的使用linux内核,这其实就是shell的本质。

使用专业术语的说法来解释,Shell其实是一个命令解释器,它通过接受用户输入的Shell命令来启动、暂停、停止程序的运行或对计算机进行控制。

2、shell脚本

■ shell脚本就是由Shell命令组成的执行文件,将一些命令整合到一个文件中,进行处理业务逻
辑,脚本不用编译即可运行,它从一定程度上减轻了工作量,提高了工作效率,还可以批
量、定时处理主机,方便管理员进行设置或者管理。

3、shell脚本编写注意事项

■ shell命名:shell脚本名称命名一般为英文、大写、小写、后缀以.sh结尾不能使用特殊符号、空格

■名称要写的一眼可以看出功能,也就是顾名思义

■ shell脚本首行需要#!/bin/bash开头

■ shell脚本变量不能以数字、特殊符号开头,可以使用下划线_,但不能用破折号

二、shell脚本的构成

■ 脚本声明

■ 注释信息
■ 可执行语句

三、编写shell脚本

1、编写简单的脚本并运行

[root@slv ~]# vim helloworld.sh


[root@slv ~]# bash helloworld.sh

[root@slv ~]# source helloworld.sh
[root@slv ~]# chmod +x helloworld.sh
[root@slv ~]# ./helloworld.sh

2、编写nginx脚本

# 逻辑顺序:先交装依赖关系,再进入到系统默认的安装包目录src,使用wget命令到网上下载nginx1.26.1版本的交装包,然后解压,再移动到nginx 安装目录,执行编译安装并配置,编译,编译安装)

[root@slv ~]# vim install_nginx.sh


[root@slv ~]# chmod +x install_nginx.sh
[root@slv ~]# ./install_nginx.sh

四、变量

1、自定义变量

■ 变量名=值中,等于号=之前和之后不能有空格,比如:name=yang,这样是错的,
name=yang 才对

■ 变量名=值中,值内如果输入数学算式,是没办法算出结果的,只会输出字符串。

[root@slv ~]# b=4
[root@slv ~]# echo $b
4

2、环境变量

■ 由系统维护,用于设置工作环境

- $PWD

. $SHELL

· $USER

[root@slv ~]# echo $PWD
/root
[root@slv ~]# echo $SHELL
/bin/bash

3、在脚本中读取参数

[root@slv ~]# vim test001.sh

[root@slv ~]# bash test001.sh 1 2 3 4 5
1
2
3
4
5

[root@slv ~]# bash test001.sh a b d f e
a
b
d
f
e

3、位置变量

$0:第一个字段表示命令名或脚本名称

$1:脚本要处理的第一个参数

$2:脚本要处理的第二个参数

Shell脚本最多可以直接处理9个参数

[root@slv ~]# vim createacc.sh


[root@slv ~]# bash createacc.sh zhangsan 1

4、预定义变量

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

预定义变量是Bash程序预先定义好的一类特殊变量,用户只能使用预定义变量,而不能创
建新的预定义变量,也不能直接为预定义变量赋值。

$ *: 将所有参数作为整体

$@:单个数的组合,每个参数占一行
$0:保存了脚本名称

$ ?: 保存命令或脚本的执行状态码

$#:保存脚本要处理的参数的个数

[root@slv ~]# vim test002.sh

[root@slv ~]# bash test002.sh 1 2 3 a b c
1 2 3 a b c

[root@slv ~]# vim test002.sh


[root@slv ~]# bash test002.sh 1 2 3 a b c
1 2 3 a b c
0
6
test002.sh

5、变量的定义与输出
5.1 定义一个新的变量

格式:变量名=变量值
注意:变量名必须以字母或下划线开头,严格区分大小写

5.2 变量符号运用

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

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

反撇号:或$():命令替换,提取命令的执行结果

6、变量的作用范围

默认情况下,新定义的变量只在当前Shell环境中有效,因此称为局部变量。当进入子程序或新的子shell 时,局部变量将无法再使用。

为了使用户定义的变量在所有子Shell环境中能够继续使用,减少重复设置工作,可以通过内部命令export将指定的变量导出为“全局变量”。

格式 1:export 变量名

格式 2:export 变量名=值 

五、判断语法

1、条件判断

[root@slv ~]# vim if.sh


[root@slv ~]# bash if.sh
两个数字不相等

2、数字判断

[root@slv ~]# vim if.sh


[root@slv ~]# bash if.sh
请输入一个数
2
请输入第二个数字
4
两个数字不相等

3、创建检测网络是否畅通脚本

[root@slv ~]# vim netping.sh


[root@slv ~]# bash netping.sh www.baidu.com
输入网址:www.baidu.com
PING www.a.shifen.com (180.101.50.188) 56(84) bytes of data.
64 bytes from 180.101.50.188 (180.101.50.188): icmp_seq=1 ttl=128 time=29.6 ms
64 bytes from 180.101.50.188 (180.101.50.188): icmp_seq=2 ttl=128 time=99.5 ms
64 bytes from 180.101.50.188 (180.101.50.188): icmp_seq=3 ttl=128 time=35.6 ms

[root@slv ~]# vim netping.sh


[root@slv ~]# bash netping.sh 
输入网址:www.baidu.com
0

[root@slv ~]# vim netping.sh


[root@slv ~]# bash netping.sh 
输入网址:www.baidu.com
网络通畅

六、字符串判断

1、格式

[ 字符串1 == 字符串2]       字符串内容相同

[字符串1 != 字符串2]         字符串内容不同
[ -z 字符串 ]                       字符串内容为空

[-n字符串]                          字符串内容不为空

[root@slv ~]# aaa="abc"
[root@slv ~]# echo $aaa
abc
[root@slv ~]# test $aaa == "abc"
[root@slv ~]# echo $?
0                            //真
[root@slv ~]# test $aaa == "aaa"
[root@slv ~]# echo $?
1                            //假

2、案例
2.1 用户登录

[root@slv ~]# vim zifu.sh


[root@slv ~]# bash zifu.sh
请输入账号admin
欢迎登陆:admin

[root@slv ~]# bash zifu.sh
请输入账号abc
账号或密码错误

 2.2 rpm检查是否安装软件

[root@slv ~]# vim rpm.sh


[root@slv ~]# bash rpm.sh
1

[root@slv ~]# vim rpm.sh

七、文件、目录、权限判断

1、格式

[操作符 文件或目录]

常用的测试操作符:

-e“文件目录或自定变量”        判断文件或目录是否存在exists 

-f“文件目录或自定变量”        判断是否为文件 isfile
-d"文件目录或自定变量”        判断是否为目录
-w“文件目录或自定变量”        判断是否可写
-r"文件目录或自定变量”        判断是否可读
-x“文件目录或自定变量”        判断是否可执行

-s“文件目录或自定变量”        判断文件大小,非0时为真(若为非空文件,则为真)
-z"文件目录或自定变量”        判断变量参数值是否为空,为空为真,非空为假

2、示例

[root@slv ~]# touch abc
[root@slv ~]# ls -lh abc
-rw-r--r-- 1 root root 0 7月  26 11:26 abc

[root@slv ~]# [ -e "abc" ]
[root@slv ~]# echo $?
0
[root@slv ~]# [ -e "zzz" ]
[root@slv ~]# echo $?
1
[root@slv ~]# [ -w "zzz" ]
[root@slv ~]# echo $?
1
[root@slv ~]# [ -w "abc" ]
[root@slv ~]# echo $?
0
[root@slv ~]# [ -x "abc" ]
[root@slv ~]# echo $?
1

[root@slv ~]# chmod +x abc

[root@slv ~]# ls -lh abc
-rwxr-xr-x 1 root root 0 7月  26 11:26 abc
[root@slv ~]# [ -x "abc" ]
[root@slv ~]# echo $?
0

八、与或判断

判断多个条件

多个条件其中一个成立,或

多个条件都要成立,与

或运算判断:||           或,两个条件满足其一即可,还有-o

与运算判断:&&        与,两个条件都得满足才行,还有-a

1、与判断

[root@slv ~]# vim test2.sh


[root@slv ~]# bash test2.sh
请输入名称hs^H
不行
[root@slv ~]# bash test2.sh
请输入名称hehe
友好

2、或判断

[root@slv ~]# vim test3.sh


[root@slv ~]# bash test3.sh
nl30
xb女
加钱

3、多重判断

[root@slv ~]# vim elif.sh


[root@slv ~]# bash elif.sh
1新增文件 2删除文件 3修改文件 4查找文件
请选择序号1
[root@slv ~]# ls

[root@slv ~]# bash elif.sh
1新增文件 2删除文件 3修改文件 4查找文件
请选择序号2
[root@slv ~]# ls

九、shell脚本读取用户输入和计算

1、shell读取用户输入 
1. read命令

read:用来从标准输入中读取数据并赋值给变量。如果没有进行重定向,默认就是从键盘
读取用户输下的数据;如果进行了重定向,那么可以从文件中读取数据。

1.1 格式

read[-选项][变量赋值]

1.2 选项

变量赋值:可以有一个,也可以有多个

-p: 显示提示信息

-s:静默模式,不会在屏幕上显示输入的字符。可用于输入密码或其他需要保密的信息

2. 示例
2.1 一个变量赋值

[root@slv ~]# read -p "输入一个数据" s
输入一个数据jdwdh
[root@slv ~]# echo $s
jdwdh
[root@slv ~]# read -p "输入一个数据" -s s
输入一个数据[root@slv ~]# echo $s
hdsuwgd

2.2 多个变量赋值

[root@slv ~]# read -p "三个变量" a b c
三个变量12 18 20
[root@slv ~]# echo $a
12
[root@slv ~]# echo $b
18
[root@slv ~]# echo $c
20

3. 案例

[root@slv ~]# vim register.sh


[root@slv ~]# bash register.sh 
usrname:abc
passwd:1
更改用户 abc 的密码 。
passwd:所有的身份验证令牌已经成功更新。
账户abc注册成功
[root@slv ~]# su abc
[abc@slv root]$ su
密码:

十、循环语法

1、for循环
1. 语法

for 变量名 in 取值列表(范围)

do  

命令序列

done

取值列表:数字范围、字符串、多个字符串、提前设定好的变量等

for默认以所有的空白字符进行分隔: tab、空格、回车,去循环处理

分隔成几段就循环几次

2.案例

[root@slv ~]# yum -y install inotify-tools
[root@slv ~]# mkdir /abc
[root@slv ~]# nohup inotifywait -mr /abc/
[root@slv ~]# cat nohup.out
[root@slv ~]# vim wait.sh


[root@slv ~]# bash wait.sh

[root@slv ~]# vim loop.sh


[root@slv ~]# bash loop.sh

[root@slv ~]# vim l.sh


[root@slv ~]# bash l.sh
青岛是个好地方
长沙是个好地方
庆阳是个好地方

2、while 循环
1. 作用

重复测试某个条件,只要条件成立则反复执行

2. 结构

while 条件测试操作

do

命令序列

done

3. while 和 for区别

while循环也有条件判断,当条件成立的时候,会循环执行。当条件不成立退出 if判断当条件成立时,会执行一次,然后退出。当条件不成立时直接退出

十一、sed

1、概述

sed 是文本处理工具,读取文本内容,根据指定条件进行处理,可实现 增删改查的功能。sed 依赖于正则表达式。

2、格式

sed '过滤+动作' 文件路径

3、选项

-e 指定要执行的命令 (操作) ,只有一个编辑命令 (操作) 时可省略

-n 只输出处理后的行,读入时不显示,不对原文件进行修改

-i 直接修改源文件,不输出结果

十二、编辑命令格式

1、格式

'/地址 1,地址 2/操作(参数)'

地址 可为行数、正则表达式、$,没有地址代表全文

2、操作

p 打印(输出)

d 删除(整行)

s 替换(字符串匹配)

c 替换(整行)

r 读取指定文件(追加到行后)

a (append)追加到指定内容到行后

i (insert)追加指定内容到行前

w 另存为

n 表示读入下一行内容

H 复制到剪贴板

g 将剪贴板中的内容覆盖到指定行

G 将剪贴板中的内容追加到指定行后

3、示例 

1. 配置一个自动设置静态ip以及关闭selinux服务 关闭防火墙服务 关闭NetWOrkManager,修改
主机名称的脚本,ip和主机名称使用read输入

#!/bin/bash
#备份
cp /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-ens33.bak

#修改dhcp为none
sed -i '/dhcp/s/dhcp/none/g' /etc/sysconfig/network-scripts/ifcfg-ens33
read -p "请输入指定的ip地址" ip
#在文档最后添加5行
#IPADDR
sed -i '$aIPADDR='"$ip"'' /etc/sysconfig/network-scripts/ifcfg-ens33
#NETMAST
sed -i '$aNETMASK=255.255.255.0' /etc/sysconfig/network-scripts/ifcfg-ens33
#GATEWAY
sed -i '$aGATEWAY=192.168.8.2' /etc/sysconfig/network-scripts/ifcfg-ens33
#DNS1
sed -i '$aDNS1=8.8.8.8' /etc/sysconfig/network-scripts/ifcfg-ens33
#DNS2
sed -i '$aDNS2=114.114.114.114' /etc/sysconfig/network-scripts/ifcfg-ens33
#修改uuid
sed -i '/UUID/cUUID='"$(uuidgen)"'' /etc/sysconfig/network-scripts/ifcfg-ens33

#修改主机名称
read -p "请输入主机名称" hn
hostnamectl set-hostname $hn

#停用selinux
setenforce 0
sed -i '/SELINUX=enforcing/cSELINUX=disabled' /etc/selinux/config
#停用防火墙
systemctl stop firewalld
systemctl disable firewalld

#停用NetworkManager
systemctl stop NetworkManager
systemctl disable NetworkManager

#重启网络服务
systemctl restart network

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

GPT-4o mini:AI技术的平民化革命

目录 引言一、GPT-4o mini简介二、性能表现三、技术特点四、价格与市场定位五、应用场景六、安全性与可靠性七、未来展望八、代码示例结语 引言 在人工智能的浪潮中,大模型技术一直是研究和应用的热点。然而,高昂的成本和复杂的部署常常让许多企业和开发…

03。正式拿捏ArkTS语言第一天

1, 打印日志命令 : console.log() 2, 三种基本数据类型: number 数字类型 (数字) string 字符串类型(例如:“我是字符串”) boolean 布尔类型 (true 或者 false) ***…

利用 ARP 欺骗,截获任意主机之间网络流量

ARP 欺骗实现原理: 通过伪造(未经请求)ARP 应答,从而改变受害端主机 ARP 表中的 IP-MAC 映射关系,将来自 LAN 上的受害端主机的数据包重定向到 LAN 上的另一台主机(攻击端,arpspoof 运行端&…

Idea 编译项目报错 java: java.lang.OutOfMemoryError:GC overhead limit exceeded

报错 java: java.lang.OutOfMemoryError: WrappedJavaFileObject[org.jetbrains.jps.javac.InputFileObjectpos13979: GC overhead limit exceeded解决 默认是700M,有的时候项目引入的依赖包比较大,可能超过了700M,需要扩大,根据实际情况设…

C++ 数字和数组解析

文章目录 1. 定义数字 2. 数学运算 3. 随机数 4. 数组 声明数组 初始化数组 5. 访问数组元素 6. 数组类型 7. 多维数组 二维数组 初始化二维数组 访问二维数组元素 8. 指向数组的指针 9. 传递数组给函数 10. 从函数返回数组 1. 定义数字 通常,当需要…

Unity UGUI 之 Mask

本文仅作学习笔记与交流,不作任何商业用途 本文包括但不限于unity官方手册,唐老狮,麦扣教程知识,引用会标记,如有不足还请斧正 本文在发布时间选用unity 2022.3.8稳定版本,请注意分别 1.什么是遮罩 遮罩是一…

基于springboot+vue+uniapp的养老院系统小程序

开发语言:Java框架:springbootuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包&#…

SSM电子商务系统-计算机毕业设计源码68470

基于SSM框架的电子商务系统的设计与实现 摘 要 随着电子商务的迅猛发展和计算机信息技术的全面跃升,网上购物系统由于其迎合了人们诉求和期望而渗入社会生活各个层面和角落。本文设计并实现了一个基于SSM框架的电子商务系统。该系统旨在为用户提供一个舒适且快捷的…

子序列 392、524、521、522

392. 判断子序列(简单) 给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace…

C语言程序设计(二)

四.找素数 素数:除了1和它本身不再有其他因数的自然数。换句话说:一个大于1的自然数 ,如果只能被1和它本身整除,那就是素数(质数)。 在打印中遇到的问题就是,知道怎么写却总是运行不起来。主要…

尚硅谷vue全家桶(vue2+vue3)笔记

Vue2 一、Vue核心 01_简介 1.特点 采用组件化模式,提高代码复用率、且让代码更好维护。声明式编码,让编程人员无需直接操作DOM(命令式编码),提高开发效率。使用虚拟DOM优秀的Diff算法,尽量复用DOM节点。…

ks滑块验证码逆向分析与python识别

文章目录 1. 写在前面3. 接口分析3. 算法实现 【🏠作者主页】:吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python…

从零搭建pytorch模型教程(八)实践部分(二)目标检测数据集格式转换

前言 图像目标检测领域有一个非常著名的数据集叫做COCO,基本上现在在目标检测领域发论文,COCO是不可能绕过的Benchmark。因此许多的开源目标检测算法框架都会支持解析COCO数据集格式。通过将其他数据集格式转换成COCO格式可以无痛的使用这些开源框架来训…

在MATLAB中使用importrobot导入机械臂刚体树时没有找到模型文件,只显示坐标;改为使用loadrobot

没有mesh文件夹,所以找不到模型文件 改为使用loadrobot,直接加载刚体树数据

【C++题解】1782. 字符图形2-星号倒直角

问题&#xff1a;1782. 字符图形2-星号倒直角 类型&#xff1a;嵌套循环、图形输出 题目描述&#xff1a; 打印字符图形。 输入&#xff1a; 一个整数&#xff08; 0<n<10 &#xff09;。 输出&#xff1a; 一个字符图形。 样例&#xff1a; 输入&#xff1a; 3…

重生之我当程序猿外包

第一章 个人介绍与收入历程 我出生于1999年&#xff0c;在大四下学期进入了一家互联网公司实习。当时的实习工资是3500元&#xff0c;公司还提供住宿。作为一名实习生&#xff0c;这个工资足够支付生活开销&#xff0c;每个月还能给父母转1000元&#xff0c;自己留2500元用来吃…

深入探讨 I/O 多路复用:提升系统 I/O 效率的关键技术

摘要 I/O&#xff08;输入/输出&#xff09;操作是计算机系统中不可或缺的一部分&#xff0c;而 I/O 多路复用技术则是提高系统 I/O 效率的重要手段。本文将浅谈 I/O 的基本概念&#xff0c;重点探讨 I/O 多路复用技术的原理、优势以及在现代系统中的应用。 引言 在现代计算…

LoRaWAN设备的两种入网方式(ABP和OTAA)

目录 一、OTAA 1、名词解释 2、入网流程 二、ABP 三、两种入网方式的比较 一、OTAA 1、名词解释 &#xff08;1&#xff09;AppEUI&#xff1a;64位&#xff08;8字节&#xff09;的唯一标识符&#xff0c;用于标识特定的应用程序或组织&#xff08;如果用的是chirpstac…

Android BLE蓝牙广播发送数据

1. 调试BLE蓝牙广播数据 参考 android蓝牙BLE&#xff08;四&#xff09; —— 实战 android蓝牙BLE&#xff08;四&#xff09; —— 实战 - 简书 2. Android机可直接安装调试助手 BLE调试助手下载2024安卓手机版_手机app免费下载

【linux】在多核CPU下,好像看到不同进程在不同CPU调度

在2353这行打印的情况来看&#xff0c;操作系统好像给不同的进程分配不同的CPU&#xff0c;从上图来看&#xff0c;同一个进程好像基本使用的相同的CPU&#xff1a; 其实摸索syscall文件系统操作&#xff0c;本意是想找到内核文件系统中文件的创建&#xff0c;写入&#xff0c;…