SHEEL脚本编程

一、shell基本知识

Ⅰ、为什么要学习和使用shell编程

通过编程,简化日常的维护工作,使得管理员从简单的重复劳动解脱出来

Ⅱ、什么是shell

shell的功能

Shell又称命令解释器,它能识别用户输入的各种命令,并传递给操作系统。它的作用类似于Windows操作系统中的命令行,但是,Shell的功能远比命令行强大的多。在UNIX或者localhost中,Shell既是用户交互的界面,也是控制系统的脚本语言。

shell的分类

Bourne Shell:标识为sh,该Shell由Steve Bourne在贝尔实验室时编写。在许多Unix系统中,该Shell是root用户的默认的Shell。

Bourne-Again Shell:标识为bash,该Shell由Brian Fox在1987年编写,是绝大多数localhost发行版的默认的Shell。

Korn Shell:标识为ksh,该Shell由贝尔实验室的David Korn在二十世纪八十年代早期编写。它完全向上兼容 Bourne Shell 并包含了C Shell 的很多特性。

C Shell:标识为csh,该Shell由Bill Joy在BSD系统上开发。由于其语法类似于C语言,因此称为C Shell。

查看当前系统支持的shell?

[root@localhost ~]# cat /etc/shells

查看当前系统支持的shell?

[root@localhost ~]# echo $SHELL

Ⅲshell脚本的书写规范

  • 通常情况下,我们会给shell脚本起名为filename.sh

  • 第一行写声明,声明当前的shell脚本使用哪个命令解释器:#!/bin/bash

  • 除了第一行以外,以#开头的行都为注释

    • shell脚本的作者

    • shell脚本的创建时间

    • 脚本的作用,命令的说明

#编辑.sh文件时自动生成关于脚本的注释
[root@localhost ~]# cat /root/.vimrc

#用vim创建新文件会自动生成脚本文件的注释
注:用touch命令创建不会自动生成脚本文件的注释

Ⅳ、shell脚本的执行方式

交互式执行

[root@localhost ~]# for filename in `ls /etc`
> do
> if echo "$filename" | grep "passwd"
> then
> echo "$filename"
> fi
> done

作为程序文件执行(常用)

对于一组需要经常重复执行的Shell语句来说,将它们保存在一个文件中来执行。我们通常称这种包 含多个Shell语句的文件为Shell脚本,或者Shell脚本文件。脚本文件是普通的文本文件,可使用任何的 文本编辑器查看或修改Shell脚本。

[root@localhost ~]# mkdir /test
[root@localhost ~]# cd /test
[root@localhost test]# vim test1.sh
#!/bin/bash
#########################
#File name:test1.sh
#Version:v1.0
#Email:admin@test.com
#Created time:2024-11-02 14:56:01
#Description:
#########################
for filename in `ls /etc`
doif echo "$filename" | grep "passwd"thenecho "$filename"fi
done

Ⅴ、实行脚本的方法

bash ./filename.sh(产生子进程,再运行,使用当前指定的bash shell去运行)

./filename.sh(产生子进程,再运行,使用脚本里面指定的shell去运行。使用该种方式执行需要x权限)

source ./filename.sh(source命令是一个shell内部命令,其功能是读取指定的shell程序文件,并且依次执行其中的所有的语句,并没有创建新的子shell进程,所以脚本里面所有创建的变量都会保存到当前的shell里面)

. ./filename.sh(和source一样,也是使用当前进程执行)

示例:

[root@localhost test]# vim test2.sh
#!/bin/bash
#########################
#File name:test2.sh
#Version:v1.0
#Email:admin@test.com
#Created time:2024-11-02 15:14:39
#Description:
#########################
cd /tmp
pwd

 

注:执行shell脚本时,如果使用1和2这种方式执行会在当前的进程下产生一个新的bash子进程,所以子进程切换到了/tmp目录,当脚本结束,子进程也就结束了,所以当前进程的目录不会发生变化;3和4方式执行时,不会产生新的进程,所以脚本执行结束后当前的目录会变成/tmp

[root@localhost tmp]# cd -		返回上一级目录

Ⅵ、shell脚本的退出状态码

  • 在UNIX或者Linux中,每个命令都会返回一个退出状态码。退出状态码是一个整数,其有效范围为0~255。通常情况下,成功的命令返回0,而不成功的命令返回非0值。非0值通常都被解释成一个错误码。行为良好的UNIX命令,程序和工具都会返回0作为退出码来表示成功。

  • Shell脚本中的函数和脚本本身也会返回退出状态码。在脚本或者是脚本函数中执行的最后的命令会决定退出状态码。另外,用户也可以在脚本中使用exit语句将指定的退出状态码传递给Shell。

  • 可以使用exit num指定脚本的退出状态码。

 

[root@localhost ~]# echo $?		查看上一条命令的状态码 
上一条命令执行成功状态码为0;执行失败为2

 

二、shell的变量

Ⅰ、什么是变量

变量就是程序设计语言中可以变化的量,本质上来讲,变量就是在程序中保存用户数据的一块内存空间。而变量名就是这块内存空间的地址。

Ⅱ、变量的命令

  • 可以使用数字、字母和下划线给变量命名

  • 不能用数字开头

  • 如果给同一个变量赋值多次,最后一次赋值会覆盖之前的值

合法的变量名:name、NAME、name_1、Name_1

不合法的变量名:1name、name*1、name_1%

Ⅲ、查看变量的值

  • 查看单个变量的

[root@localhost ~]# uid=123		定义一个变量
[root@localhost ~]# echo $uid
123
[root@localhost ~]# echo ${uid}
123
[root@localhost ~]# printf "$uid\n"
123
[root@localhost ~]# printf "${uid}\n"
123
如果后两种方式不加\n
[root@localhost ~]# printf "$uid"
123[root@localhost ~]#

查看多个变量的值

  • set:查看所有的变量和函数

  • declare:查看所有的变量和函数

  • env:显示所有的全局变量

 

Ⅳ、变量的定义

  • 在命令行中定义:退出当前进程后该变量就失效,其他终端上无法使用该变量

  • 在文件中定义:永久生效

    • 当前用户生效的文件

      ~/.bashrc 和~/.bash_profile

    • 所有用户生效的文件

      /etc/bashrc、/etc/profile、/etc/profile.d/*.sh

su和su - 切换方式加载的文件不同

Ⅴ、变量的分类

Ⅵ、取消变量

[root@localhost etc]# unset var

 

Ⅶ、变量运算

实验:计算用户输入的任意两个整数和、差、乘积、商、余数

方法一:

[root@localhost test]#vim mkdir test4.sh
#!/bin/bash
#########################
#File name:test3.sh
#Version:v1.0
#Email:admin@test.com
#Created time:2024-11-02 16:13:53
#Description:
#########################
a=$1
b=$2
echo a+b=$((a+b))
echo a-b=$((a-b))
echo a*b=$((a*b))
echo a/b=$((a/b))
echo a%b=$((a%b))

 方法二:

#!/bin/bash
#########################
#File name:test3.sh
#Version:v1.0
#Email:admin@test.com
#Created time:2024-11-02 16:13:53
#Description:
#########################
read -p "please input tow number:" a b
echo $a+$b=$(($a+$b))
echo $a-$b=$((a-b))
echo $a*$b=$((a*b))
echo $a/$b=$((a/b))
echo $a%$b=$((a%b))

 示例:截取字符串

[root@localhost test]# str1="I love RHCE"		定义变量
[root@localhost test]# echo ${str1}				返回变量内容
I love RHCE
[root@localhost test]# echo ${#str1}			返回变量长度
11
[root@localhost test]# echo ${str1:1}			从I之后截取搭到结束
love RHCE
[root@localhost test]# echo ${str1:1:3}			从I之后截取三位
lo
[root@localhost test]# echo ${str1::3}			指定长度,不指定索引位置从头开始
I l

 

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

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

相关文章

三、Kafka集群

一、Kafka集群的概念 1、目的 高并发、高可用、动态扩展。 主备数据架构、双活节点、灾备数据中心。 如果是服务的地理范围过大也可以使不同的集群节点服务不同的区域,降低网络延迟。 2、Kafka集群的基本概念 1)复制(镜像) kaf…

关于Android Studio Koala Feature Drop | 2024.1.2下载不了插件的解决办法

解决 androidStudio Settings->Plugins下载插件,点击install后没反应,同时插件描述相关显示不出来 第一步: 第二步: 点击设置,勾选Auto-detect proxy settings,输入网址 https://plugins.jetbrains.com…

近期学习前端的心得

1.如果你这一行的编辑权利在于你这一行的某个字段的值,你可以使用这样:disabled"scope.row.某字段 ! 某字段的值" 2.如果你不想使用弹出框的形式来修改数据库,可以采用 对“某字段”列使用了 el-input,并绑定了 v-model 到 sco…

笔记本双系统win10+Ubuntu 20.04 无法调节亮度亲测解决

sudo add-apt-repository ppa:apandada1/brightness-controller sudo apt-get update sudo apt-get install brightness-controller-simple 安装好后找到一个太阳的图标,就是这个软件,打开后调整brightness,就可以调整亮度,可…

若依微服务架构遇到的一些问题记录

一、nacos启动问题 需要看官网的准备工作,认真看,版本问题卡了两天 https://doc.ruoyi.vip/ruoyi-cloud/document/hjbs.html#%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C 1.下载nacos,版本需要对应上 版本说明链接 2.记得运行数据库&#xff0…

语音合成技术:AI如何模仿人类声音

大家好,我是Shelly,一个专注于输出AI工具和科技前沿内容的AI应用教练,体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具,拥抱AI时代的到来。 AI工具集1:大厂AI工具【共23款…

【客户端开发】electron 中无法使用 js-cookie 的问题

产生问题的原因 谷歌浏览器升级之后,出于安全考虑,cookie的SameSite属性默认值由None变为Lax,对于跨域的请求,禁止携带cookie。electron内核是chromium内核,所以也会有这个限制。 Cookie的SameSite属性用来限制第三方 Cookie&…

Linux_shell编程

shell介绍 概念: 用户编写的shell命令通过shell解释器解释后交给linux内核去执行. shell是一个程序(解释器程序) 用户和linux内核的桥梁. Shell 是一个 C 语言编写的脚本语言,它是用户与 Linux 的桥梁,用户输入命令交给 Shell 处理 Shell 将相应的操作传…

Java 多线程(八)—— 锁策略,synchronized 的优化,JVM 与编译器的锁优化,ReentrantLock,CAS

前言 本文为 Java 面试小八股,一句话,理解性记忆,不能理解就死背吧。 锁策略 悲观锁与乐观锁 悲观锁和乐观锁是锁的特性,并不是特指某个具体的锁。 我们知道在多线程中,锁是会被竞争的,悲观锁就是指锁…

国内PLC市场份额报告,西门子老大的地位从未动摇

【导读】国内PLC市场占有率,西门子依然是老大。 PLC市场集中度很高,从销售额来看,TOP3厂家占据一半以上的市场份额,以外资品牌为主,其中西门子排名第一,2022年市场份额约47.1%;三菱排名第二&…

Redis有什么不一样?

Redis作为一种高性能的内存数据库,以其卓越的性能、丰富的数据类型和强大的功能特性,成为了许多应用的首选数据存储方案。本文介绍Redis内存数据库,并与其他常见的key-value数据库(如Memcached)进行比较,及…

环信鸿蒙IM SDK实现附件消息发送与下载

环信HarmonyOS IM SDK 正式版已经发布,该版本全面覆盖即时通讯(IM)的核心功能,为用户提供了完整的IM全功能体验,同时支持从Android APK到 NEXT 的数据迁移,更好地满足企业在不同业务场景下的适配需求。 点…

[二维前缀和]最大纯色正方形

题目描述 铺砖的工人来到一个操场,将整个操场按正方形铺砖(整个操场可视为R行C列的矩阵,矩阵的每个元素为一块正方形砖块),正方形砖块有两种,一种为蓝色,另一种为红色。请你写一个程序求出为最…

每日OJ题_牛客_最长上升子序列(二)_贪心+二分_C++_Java

目录 牛客_最长上升子序列(二)_贪心二分 题目解析 C代码 Java代码 牛客_最长上升子序列(二)_贪心二分 最长上升子序列(二)_牛客题霸_牛客网 (nowcoder.com) 描述: 给定一个长度为 n 的数组a,求它的最长严格上升子序列的长度。 所谓子序列&#xf…

使用uniapp + Vue3 + uni.createInnerAudioContext()实现播放歌曲及歌词滚动、拖动进度条

一、大致效果 二、使用步骤 1.歌词详情页代码块 <template><view class"play"><view class"play_centent" :style"{ background-image: url( playInfo.siPic ) }"><div class"cover-mask" style"opacit…

无人机维护保养、部件修理更换技术详解

无人机作为一种精密的航空设备&#xff0c;其维护保养和部件修理更换是确保飞行安全、延长使用寿命的重要环节。以下是对无人机维护保养、部件修理更换技术的详细解析&#xff1a; 一、无人机维护保养技术 1. 基础构造理解&#xff1a; 熟悉无人机的基本构造&#xff0c;包括…

解决Redis缓存穿透(缓存空对象、布隆过滤器)

文章目录 背景代码实现前置实体类常量类工具类结果返回类控制层 缓存空对象布隆过滤器结合两种方法 背景 缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在&#xff0c;这样缓存永远不会生效&#xff0c;这些请求都会打到数据库 常见的解决方案有两种&#xff0c;分别…

【运动的&足球】足球场景目标检测系统源码&数据集全套:改进yolo11-ASF-P2

改进yolo11-RetBlock等200全套创新点大全&#xff1a;足球场景目标检测系统源码&#xff06;数据集全套 1.图片效果展示 项目来源 人工智能促进会 2024.11.03 注意&#xff1a;由于项目一直在更新迭代&#xff0c;上面“1.图片效果展示”和“2.视频效果展示”展示的系统图片或…

【STM32】GPIO通用输入输出口

文章目录 一、GPIO的概念二、STM32中GPIO的基本结构三、GPIO位结构输入部分分析输出部分分析GPIO的8种模式 四、GPIO相关函数 一、GPIO的概念 GPIO&#xff08;General Purpose Input Output&#xff09;&#xff0c;意为通用输入输出口&#xff0c;在嵌入式系统中&#xff0c;…

stm32疑难杂症之电压不够程序跑飞

在开发阶段&#xff0c;如果出现程序不断重启的情况。 首先先检查是不是代码问题。 1.数组越界。定义的数组只有50个单元&#xff0c;但是程序运行的过程中&#xff0c;却给他赋给50个单元。 2.中断耗时太长&#xff0c;刚出中断又进去了。这时的现象是程序一直在中断中执行…