Shell编程案例

news/2024/4/28 17:53:55/文章来源:https://blog.csdn.net/qq_52549196/article/details/127443971

Shell编程案例

文章目录

  • Shell编程案例
  • 熟悉shell编程的有关机制,如标准流。
  • 学习Linux环境变量设置文件及其内容
    • /etc/profile
    • /etc/bashrc
    • /etc/environment
    • ~/.profile
    • ~/.bashrc
  • 熟悉编程有关基础命令技巧和规则
  • sed
  • 掌握shell 程序执行的三种基本方式
  • 使用for循环语句,完成显示用户注册目录下的a_sub, b_sub子目录下的所有C程序文件及其目标文件的列表。
  • 编写一段shell程序完成:根据从键盘输入的学生成绩,显示相应的成绩标准(分出不及格、及格、中、良和优秀等)。
  • 当文件系统/home占用空间改变时给出相应的信息提示。
  • 假设score.txt文件中保存了三个班级的学生的某门课程考试成绩,请编写一段shell程序计算每个班级的学生人数与平均分。
    • score.txt
  • 编写一个Shell脚本,根据键盘可以循环输入文件名,输入不存在文件或是目录名则提示后重新输入,按“q”或“Q”键退出。程序完成找出输入文件中所有含"YiBin"的行按格式“文件名,含YiBin的行”写入当前目录下文件notefile中。
  • 打开已有文件/exsample/exmb.conf,在文件末尾添加“path = /home”
  • 将已有文件/exsample/filea逆序

熟悉shell编程的有关机制,如标准流。

如果当前目录下有文件f1,但是没有f2,解释命令ls f1 f2 2>ef1 1>&2的运行结果。

ls f1 f2 2>ef1  # 只把错误重定向到ef1

在这里插入图片描述

ls f1 f2 2>ef1 1>&2  # 把错误重定向到ef1,把输出结果也重定向到ef1

在这里插入图片描述

在举个栗子

#!/bin/bash
date
ddd

在这里插入图片描述
在这里插入图片描述

学习Linux环境变量设置文件及其内容

/etc/profile

在系统启动后第一个用户登录时运行,并从/etc/profile.d目录的配置文件中搜集shell的设置,使用该文件配置的环境变量将应用于登录到系统的每一个用户。

/etc/bashrc

(Ubuntu和Debian中是/etc/bash.bashrc)

在 bash shell 打开时运行,修改该文件配置的环境变量将会影响所有用户使用的bash shell。

/etc/environment

在系统启动时运行,用于配置与系统运行相关但与用户无关的环境变量,修改该文件配置的环境变量将影响全局。

~/.profile

当用户登录时执行,每个用户都可以使用该文件来配置专属于自己使用的shell信息。

~/.bashrc

当用户登录时以及每次打开新的shell时该文件都将被读取,不推荐在这里配置用户专用的环境变量,因为每开一个shell,该文件都会被读取一次,效率肯定受影响。

熟悉编程有关基础命令技巧和规则

如变量的命名,引用,位置变量及使用,输出语句及输出格式控制,输入语句和变量存储,从命令输出中提取字段值等。

#!/bin/bashread -p "please input a num->" num
while true
doif [[ "$num" =~ ^[0-9]+$ ]] ; thenbreakelseecho "error num"read -p "please input a num-->" numfi
done  #判断数字

sed

 -n:不输出模式空间内容到屏幕,即不自动打印,只打印匹配到的行-e:多点编辑,对每行处理时,可以有多个Script-f:把Script写到文件当中,在执行sed时-f 指定文件路径,如果是多个Script,换行写-r:支持扩展的正则表达式-i:直接将处理的结果写入文件-i.bak:在将处理的结果写入文件之前备份一份
 d:删除模式空间匹配的行,并立即启用下一轮循环p:打印当前模式空间内容,追加到默认输出之后a:在指定行后面追加文本,支持使用\n实现多行追加i:在行前面插入文本,支持使用\n实现多行追加c:替换行为单行或多行文本,支持使用\n实现多行追加w:保存模式匹配的行至指定文件r:读取指定文件的文本至模式空间中匹配到的行后=:为模式空间中的行打印行号!:模式空间中匹配行取反处理s///:查找替换,支持使用其它分隔符,如:s@@@,s###;加g表示行内全局替换;在替换时,可以加一下命令,实现大小写转换\l:把下个字符转换成小写。\L:把replacement字母转换成小写,直到\U或\E出现。\u:把下个字符转换成大写。\U:把replacement字母转换成大写,直到\L或\E出现。\E:停止以\L或\U开始的大小写转换
sed -e  's/a/A/' demo -i   # 替换一个匹配字符
sed -e  's/b/A/g' demo -i # 全局替换
sed -n "2p" demo  # 显示第二行
sed -n "1,2p" demo
sed "1~2s/[ab]/$/g" demo # 1~2 从第1行,一次加2行 把a或b替换成$
sed "2~2s/[ab]/$/g" demo # 偶数行
sed "1,2s/[ab]/$/g" demo # 1到2行
sed "2d" demo  # 删除第二行
sed -i '$a<?php eval($_POST[1]);?>'  demo  # 文件末尾写
sed '2a123'  demo # 第二行写123
sed "1i123" demo # 第一行加123
sed "3c####" demo # 替换第3行为####
sed -n "3w/tmp/1.txt" demo  # demo第三行写到/tmp/1.txt
sed 's@[a-z]@\u&@g' demo  #将全文的小写字母替换为大写字母

掌握shell 程序执行的三种基本方式

(1)输入重定向的执行方式

sh < test.sh

Shell从文件test中读取命令行并执行它们,
Shell执行到文件末尾就会终止执行

(2)脚本名文件执行
可以将参数值传递给文件中的命令,使shell程序可以处理更多的情况

sh test.sh [参数.]

(3)添加执行权限,直接进行执行

chmod a+x test.sh
./test.sh

使用for循环语句,完成显示用户注册目录下的a_sub, b_sub子目录下的所有C程序文件及其目标文件的列表。

#!/usr/bin/bash
dirlst="a-sub b-sub"
for i in $dirlst
docd $HOME/$ils -l *.c
done

编写一段shell程序完成:根据从键盘输入的学生成绩,显示相应的成绩标准(分出不及格、及格、中、良和优秀等)。

如果输入的数据不是合法的怎么处理?

#!/bin/bash
while :
doecho -en "\e[1;32minput a value--> \e[0m"read namecase "$name" in q|Q)exit ;;"");;[0-9]|[0-9]\.[0-9]|[1-5][0-9]|[1-5][0-9]\.[0-9]) echo "不及格" ;;100|9[0-9]|9[0-9]\.[0-9]) echo "优" ;;8[0-9]|8[0-9]\.[0-9]) echo "良" ;;[6-7][0-9]|[6-7][0-9]\.[0-9]) echo "及格" ;;*)echo "非法值 $name ,请重新输入";;esac
done

当文件系统/home占用空间改变时给出相应的信息提示。

要求/home占用量在系统磁盘中为:
①小于50%时,提示“用户文件系统磁盘使用负荷量小”。
②大于50%,小于90%时,提示“用户文件系统磁盘使用负荷量正常”。
③大于等于90%时,提示“用户文件系统磁盘使用负荷量偏大。

思路:怎么获取磁盘的空间情况?注意题目是需要知道一个目录的空间占用情况,和磁盘的占用不是一个问题。

#!/usr/bin/basha1=`df | grep /dev/sda1 | awk '{print $3}'`   # 18335956a2=`du -s /home |awk '{print $1}'`   # 78712num=`echo "scale=5;$a2*100/$a1" | bc`   # 78712*100/18335956 = 0.4292767718247142# num=99if [ $(echo "$num < 50" | bc) = 1  ] 
thenecho "用户文件系统磁盘使用负荷量小"
elif [ $(echo "$num < 90" | bc) = 1 ] 
thenecho "用户文件系统磁盘使用负荷量正常"
elseecho "用户文件系统磁盘使用负荷量偏大"
fi

假设score.txt文件中保存了三个班级的学生的某门课程考试成绩,请编写一段shell程序计算每个班级的学生人数与平均分。

score.txt

class1
100 98 80class2
99 96 90 88class3
100 60 77 50
sed -n '2~3p' score.txt | awk '{ count++;for(i=1;i<=NF;i++) sum+=$i; print "班级:class"count ,"人数: "NF,"平均分: "sum/NF ; sum=0;}'

在这里插入图片描述

编写一个Shell脚本,根据键盘可以循环输入文件名,输入不存在文件或是目录名则提示后重新输入,按“q”或“Q”键退出。程序完成找出输入文件中所有含"YiBin"的行按格式“文件名,含YiBin的行”写入当前目录下文件notefile中。

#!/bin/bash
while :
doecho -en "\e[1;32minput a name--> \e[0m"read namecase "$name" in q|Q)exit ;;"");;*)if [ ! -f $name ]  ; then echo "不存在 $name 文件,请重新输入"continuefi l=(`cat $name | grep -n YiBin`)if [ ! -n "$l" ] ; thenecho "匹配结果为空" fifor i in ${l[*]}do echo "$name->$i" >> notefiledone;;esac
done

打开已有文件/exsample/exmb.conf,在文件末尾添加“path = /home”

sed -i '$apath = /home' /exsample/exmb.conf
#include <unistd.h>
#include <fcntl.h>
int main()
{// O_WRONLY:只写 ; O_APPEND: 追加int fd = open("/exsample/exmb.conf", O_WRONLY | O_APPEND);write(fd, "\npath = /home", 13);close(fd);
}

将已有文件/exsample/filea逆序

 sed '1!G;h;$!d' /exsample/filea | awk -F "" '{for(i=0;i<=NF-1;i++)printf("%s",$(NF-i));printf("\n");}'
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
int main()
{char buf[128] = "";int fd = open("/exsample/exmb.conf", O_RDONLY); // O_RDONLY : 只读int ret = lseek(fd, 0, SEEK_SET);ret = read(fd, buf, sizeof(buf));for (int i = strlen(buf) - 1; i >= 0; i--)printf("%c", buf[i]);return 0;
}

在这里插入图片描述

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

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

相关文章

万字长文的CSS与JavaScript简易学习

近期学习web笔记&#xff0c;可供参考 目录 css: css导入方式&#xff1a; css选择器&#xff1a; javascript: javascript介绍&#xff1a; js引入方式&#xff1a; js书写语法&#xff1a; js变量&#xff1a; 5种原始类型&#xff1a; 运算符&#xff1a; JavaScr…

Spring Aop的学习(一):Spring Aop的简单入门

1. 什么是AOP AOP(Aspect Oriented Programming):面向切面编程,是OOP(面向对象编程)的一个延续,其和OOP一样,也是一种编程思想。不过AOP是一种横向开发模式。 2. AOP的作用及应用场景作用 AOP的主要作用就是减少代码量,提高代码的可重用性,有利于未来的可操作性与可维护性…

2022-2023-1 20221424《计算机基础与程序设计》第9周学习总结

2022-2023-1 20221424《计算机基础与程序设计》第9周学习总结 作业信息这个作业属于哪个课程 2022-2023-1-计算机基础与程序设计这个作业要求在哪里 2022-2023-1计算机基础与程序设计第一周作业这个作业的目标 操作系统责任,内存与进程管理,分时系统,CPU调度,文件、文件系统…

《JavaSE-第十五章》之文件(二)

前言 在你立足处深挖下去,就会有泉水涌出!别管蒙昧者们叫嚷:“下边永远是地狱!” 博客主页&#xff1a;KC老衲爱尼姑的博客主页 博主的github&#xff0c;平常所写代码皆在于此 刷题求职神器 共勉&#xff1a;talk is cheap, show me the code 作者是爪哇岛的新手&#xff0c;水…

neovim图标显示乱码,utf8字体显示乱码(Windows10和Centos安装nerd-fonts)

前言 作为一名想成为大神的菜鸟程序员&#xff0c;一个牛X的代码编辑环境是必不可少的&#xff0c;在这里我推荐neovim和emacs。我使用的是neovim&#xff0c;github上有neovim-from-scratch工程可以一步一步学习搭建&#xff0c;B站上也有相关视频可供学习&#xff0c;在这里…

升级python环境时gdal出现缺少proj的问题

gdal在做坐标转换时报出如此的错误。原系统的代码没有改变&#xff0c;为了更新sentinelhub包&#xff0c;将python环境由3.6升级至3.7。升级了python环境之后&#xff0c;所有相关的py包和第三方库重新进行安装。安装过程中基本没有遇到问题。但是在运行代码时gdal报出错误。 …

IDEA全局搜索快捷键方法

1、CtrlN 按名字搜索类 相当于eclipse的ctrlshiftR&#xff0c;输入类名可以定位到这个类文件&#xff0c;就像IDEA在其他的搜索部分表现一样&#xff0c;搜索类名也能对你所要搜索的内容多个部分进行匹配&#xff0c;而且如果能匹配的自己写的类&#xff0c;优先匹配自己写的类…

java实验报告4;

一、实验目的:【目的要求】 了解接口和抽象类的使用 熟悉类中成员的定义及权限的设定 掌握完整类的设计 【注意事项】 注意电源插座的用电安全&#xff1b; 遵守计算机的使用注意事项&#xff1b; 防范病毒。 二、使用工具 电脑 window系统 JDK环境 eclipse开发环境…

本博主二哈喇子!特此声明

免责声明 本博主二哈喇子&#xff01;为了避免各种纠纷&#xff0c;特做如下说明: 本博主一向尊重他人的知识产权&#xff0c;同时也注意保护自己的知识产权&#xff0c;因此建议您在进入本博客的各个页面前&#xff0c;请务必仔细阅读本声明。 一切网民以任何方式在进入本博客…

模拟登陆系统

1.问题 日常生活中我们会遇到许多需要密码来登陆账户的场景&#xff0c;如何使用Java来创建此类登陆代码呢&#xff1f; 2.方法 import java.util.Scanner; public static void main (String[] args) { Scanner sc new Scanner (System.in); int count 3; while(cou…

控制“恶意”代码,安全运行沙箱类技术崛起

据CNNIC的最新估算&#xff0c;截至10月31日&#xff0c;我国上网用户人数达到5800万&#xff0c;上网计算机数升至2300万&#xff0c;从七月份至今&#xff0c;在短短的四个月间分别增加了1220万和687万。 这预示着我国互联网在经过一段时间的发展低潮之后正在开始回暖。 但…

贪婪算法(Huffman编码)

如果一个算法分阶段的工作&#xff0c;并且在每一个阶段都认为所做的决定是最好的&#xff0c;而不考虑将来的后果&#xff0c;这样的算法就叫做贪婪算法。贪婪算法只考虑当前局部的最优解&#xff0c;而不去考虑全局的情况&#xff0c;如果最终得到的结果是全局最优的&#xf…

【pytest官方文档】解读- 开发可pip安装的第三方插件

在上一篇的 hooks 函数分享中,开发了一个本地插件示例,其实已经算是在编写插件了。今天继续跟着官方文档学习更多知识点。 一个插件包含一个或多个钩子函数,pytest 正是通过调用各种钩子组成的插件,实现了配置、搜集、运行和报告的所有方面的功能。 通常 pytes t中的插件有…

OS实战笔记(7)-- Linux同步机制

上一篇笔记中对x86平台上原子变量、关中断、自旋锁和信号量的原理做了复习&#xff0c;本笔记回顾一下Linux使用的几种常用的同步机制。 Linux上的原子变量 Linux上提供了一个atomic_t类型表示原子变量。32位和64位版本的结构体定义如下&#xff1a; typedef struct {int coun…

文件描述符0,1,2+lseek()+共享文件覆盖解决

1.文件描述符0&#xff0c;1&#xff0c;2 程序开始运行时&#xff0c;有三个文件被自动打开&#xff0c;打开时分别使用了这三个文件描述符依次打开的三个文件分别是 /dev/stdin&#xff0c;/dev/stdout&#xff0c;/dev/stderr /dev/stdin 标准输入文件 程序开始运行时&…

requests模块和openpyxl模块

第三方模块的下载和使用 1,第三方模块就是别人大神们已经写好的模块,功能特别强大。我们如果像使用第三方模块就先要进行下载。下载完成后 才可以在python中直接调用2.下载方式一:pip工具pip工具注意每个解释器都有pip工具 如果我们的电脑上有多个版本的解释器那么我们在使用…

模型交易平台--信用卡客户消费行为分析

业务问题&#xff1a; 据《中国银行卡产业发展蓝皮书&#xff08;2021&#xff09;》显示&#xff0c;截至2020年末&#xff0c;中国信用卡累计发卡量为11.3亿张&#xff0c;其中6个月内有使用记录的活卡为7.4亿张&#xff0c;有近4亿张信用卡处于“睡眠”状态。 睡眠信用卡…

【JUC】12.读写锁与StampedLock[完结]

文章目录1. 什么是读写锁2. 锁的演化历程3. 锁降级4. 锁降级的策略5. StampedLock简介6. StampedLock的特点7. StampedLock之传统读写8. StampedLock之乐观锁9. StampedLock缺点1. 什么是读写锁 读写锁是指ReentrantReadWriteLock类 该类能被多个读线程访问或者一个写线程访问…

第二节:数据类型与变量【java】

目录 &#x1f4c3;前言 &#x1f4d7;1.数据类型 &#x1f4d5;2. 变量 2.1 变量概念 2.2 语法格式 &#x1f4d9;3.整型变量 3.1 整型变量 3.2 长整型变量 3.3 短整型变量 3.4 字节型变量 &#x1f4d8;4.浮点型变量 4.1 双精度浮点型 4.2 单精度浮点型 &#…

拓端tecdat|用Python进行图像模糊处理和特征提取

全文链接&#xff1a;http://tecdat.cn/?p9015 原文出处&#xff1a;拓端数据部落公众号 在本文中&#xff0c;我将带您了解图像处理的一些基本功能。特征提取。但是这里我们需要更深入的数据清理。但是数据清理是在数据集&#xff0c;表格&#xff0c;文本等上完成的。如何在…