linux实验之shell编程基础

这世间,青山灼灼,星光杳杳,秋风渐渐,晚风慢慢

shell编程基础

    • 熟悉shell编程的有关机制,如标准流。
    • 学习Linux环境变量设置文件及其内容
      • /etc/profile
      • /etc/bashrc
      • /etc/environment
      • ~/.profile
      • ~/.bashrc
    • 熟悉编程有关基础命令技巧和规则
      • awk
          • ( 1 ) 按行输出文本
          • ( 2 )按字段输出文本
      • sed
          • ( 1 ) 输出符合条件的文本
          • ( 2 ) 删除符合条件的文本
          • ( 3 ) 替换符合条件的文本
          • ( 4 ) 迁移符合条件的文本
      • bc
    • 掌握shell 程序执行的三种基本方式,注意调试shell程序的命令书写方式有什么不同?
    • 使用for循环语句编写一段B-shell程序,完成显示用户注册目录下的a_sub, b_sub子目录下的所有C程序文件及其目标文件的列表。
    • 编写一段shell程序完成:根据从键盘输入的学生成绩,显示相应的成绩标准(分出不及格、及格60、中70、良80和优秀90等)。
    • 为便于系统管理员对磁盘分配的管理,请编写一段B-shell程序,当文件系统/home占用空间改变时给出相应的信息提示。要求/home占用量在系统磁盘中为:
    • 假设score.txt文件中保存了三个班级的学生的某门课程考试成绩,请编写一段shell程序计算每个班级的学生人数与平均分。

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

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

1 . ls f1 f2 2>ef1 1>&2

(1)

0 表示 stdin , 标准输入 ; 1 表示 stdout , 标准输出 ; 2 表示 strerr , 标准错误输出

1>&2 表示 将标准输出重定向至标准错误输出; 2>&1 表示 将标准错误输出

(2) 所以这里是把ls f1 f2命令的报错信息写入ef1, 又把命令的输出的正常信息当成报错信息写入ef1
在这里插入图片描述
如果没有把结果重定向, 就是直接输出
在这里插入图片描述

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

根据实验系统查看/etc/profile,/etc/bashrc,/.bash_profile,/.bashrc等有关文件。

/etc/profile

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

/etc/bashrc

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

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

/etc/environment

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

~/.profile

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

~/.bashrc

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

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

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

##熟悉常见外部工具,如awk,sed,bc等的基本用法。

awk

逐行读取输入文本,并根据指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理,用于在无交互的情况下实现相当复杂的文本操作。

用法:

1 . 过滤并输出文件中符合条件的内容

awk 选项 ‘模式或条件 {编辑指令}’ 文件 1 文件 2 …

( 1 ) 按行输出文本
awk '{print}' demo.txt	//输出所有内容,等同于 cat demo.txt
awk '{print $0}' demo.txt	//输出所有内容,等同于 cat demo.txt
awk 'NR==1||NR==3{print}' demo.txt	//输出第 1 行、第 3 行内容
awk '(NR>=1)&&(NR<=3){print}' demo.txt	//输出第 1~3 行内容
awk '(NR%2)==1{print}' demo.txt	//输出所有奇数行的内容
awk '(NR%2)==0{print}' demo.txt	//输出所有偶数行的内容
awk '/^root/{print}' /etc/passwd	//输出以root 开头的行awk 
awk '/nologin$/{print}' /etc/passwd	//输出以 nologin 结尾的行
( 2 )按字段输出文本
awk '{print $3}' test.txt	//输出每行中(以空格或制表位分隔)的第 3 个字段
awk '{print $1,$3}' test.txt	//输出每行中的第 1、3 个字段
awk -F ":" '$2==""{print}' /etc/shadow //输出密码为空的用户的shadow 记录
awk 'BEGIN {FS=":"}; $2==""{print}' /etc/shadow  //输出密码为空的用户的shadow 记录
awk -F ":" '$7~"/bash"{print $1}' /etc/passwd  //输出以冒号分隔且第 7 个字段中包含/bash 的行的第 1 个字段
awk '($1~"nfs")&&(NF==8){print $1,$2}' /etc/services   //输出包含 8 个字段且第 1 个字段中包含 nfs 的行的第 1、2 个字段
awk -F ":" '($7!="/bin/bash")&&($7!="/sbin/nologin"){print}' /etc/passwd  //输出第 7 个字段既不为/bin/bash 也不为/sbin/nologin 的所有行     

2 . 从脚本中调用编辑指令,过滤并输出内容

awk -f 脚本文件 文件 1 文件 2 …

awk -F: '/bash$/{print | "wc -l"}' /etc/passwd  //调用wc -l 命令统计使用 bash 的用户个数,等同于 grep -c "bash$" /etc/passwd

awk 'BEGIN {while ("w" | getline) n++ ; {print n-2}}'  //调用w 命令,并用来统计在线用户数

awk 'BEGIN { "hostname" | getline ; print $0}'  //调用hostname,并输出当前的主机名

sed

( 1 ) 输出符合条件的文本
sed -n 'p' demo.txt //输出所有内容
sed -n 'p;n' demo.txt //输出所有奇数行,n表示读入下一行
sed -n 'n;p' demo.txt	//输出所有偶数行,n 表示读入下一行
sed -n '10,${n;p}' demo.txt	//输出第 10 行至文件尾之间的偶数行

sed 命令结合正则表达式时,格式略有不同,正则表达式以“/”包围。

sed -n '/the/p' demo.txt	//输出包含the 的行
sed -n '4,/the/p' demo.txt	//输出从第 4 行至第一个包含 the 的行
sed -n '/^PI/p' demo.txt	//输出以PI 开头的行
sed -n '/[0-9]$/p' demo.txt	//输出以数字结尾的行
sed -n '/\<wood\>/p' demo.txt   //输出包含单词wood 的行,\<、\>代表单词边界
( 2 ) 删除符合条件的文本
sed '1,3d' 1.txt        #删除第1-3行
sed '/acb/d' 1.txt      #删除所有包含acb的行
sed '/aaa/!d' 1.txt     #删除不包含aaa的行
sed '/^abc/d' 1.txt     #删除以abc开头的行
sed '/\.$/d' demo.txt	//删除以"."结尾的行
sed '/^$/d' demo.txt	//删除所有空行
( 3 ) 替换符合条件的文本
sed 's/the/THE/' demo.txt	   //将每行中的第一个the 替换为 THE
sed 's/l/L/2' demo.txt	       //将每行中的第 2 个 l 替换为 L
sed 's/the/THE/g' demo.txt	     //将文件中的所有the 替换为 THE
sed 's/^/#/' demo.txt	        //在每行行首插入#号
sed '/the/s/^/#/' demo.txt	   //在包含the 的每行行首插入#号
sed '/the/s/o/O/g' demo.txt	//将包含the 的所有行中的 o 都替换为 O
sed '3,5s/the/THE/g' demo.txt   //将第3~5行中所有the替换为 THE
sed 's/$/NO/' demo.txt	       //在每行行尾插入字符串NO
( 4 ) 迁移符合条件的文本

在使用 sed 命令迁移符合条件的文本时,常用到以下参数.

  • H:复制到剪贴板。
  • g、G:将剪贴板中的数据覆盖/追加至指定行。
  • w:保存为文件。
  • r:读取指定文件。
  • a:追加指定内容。
sed '/the/{H;d};$G' test.txt	//将包含the 的行迁移至文件末尾,{;}用于多个操作

sed '1,5{H;d};17G' test.txt	//将第 1~5 行内容转移至第 17 行后
sed '/the/w out.file' test.txt	//将包含the 的行另存为文件 out.file

sed '/the/r /etc/hostname' test.txt	//将文件/etc/hostname 的内容添加到包含 the 的每行以后

sed '3aNew' test.txt	//在第 3 行后插入一个新行,内容为New
sed '/the/aNew' test.txt	//在包含the 的每行后插入一个新行,内容为 New

sed '3aNew1\nNew2' test.txt	//在第 3 行后插入多行内容,中间的\n 表示换行

sed '1,5{H;d};17G' test.txt	//将第 1~5 行内容转移至第 17 行后

bc

  • +:加
  • -:减
  • *:乘
  • /:除
  • ^:指数
  • %:求余数
  • sqrt:开方
  • ibase:输入进制
  • obase:输出进制
  • ;要计算多个结果用分号分隔
  • scale:小数部分位数

比如:

  • 3除以2保留3位小数:echo ‘scale=3; 3/2’ | bc

  • 10进制的3转换为2进制:echo “obase=2;3” |bc

  • 10进制的11转换为16进制:echo “obase=16;11” |bc

  • 2进制转16进制:echo “obase=16;ibase=2;11” |bc

  • 2进制转10进制:echo “obase=10;ibase=2;11” |bc

  • 100开方: echo “sqrt(100)” |bc

  • 10的3次方,10的2次方,3的5次方: echo “103;102;3^5” |bc

掌握shell 程序执行的三种基本方式,注意调试shell程序的命令书写方式有什么不同?

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

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

sh < test.sh

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

sh test.sh [参数.]

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

chmod u+x test.sh
./test.sh

(4)调试shell程序的命令
在这里插入图片描述
在脚本头部添加

set -euxo pipefail

在这里插入图片描述
或执行时传⼊参数

bash -euxo pipefail xxx.sh

在这里插入图片描述

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

考虑如何验证实验结果。

用户注册目录: $HOME查看
在这里插入图片描述

#!/bin/bash
d="$HOME/a_sub $HOME/b_sub"     #找到这两个目录
for i in $d
do
    cd $i                       #然后进入目录
    ls -l *.c                   #分别输出
done

在这里插入图片描述

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

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

11.sh

#!/bin/bash
while :
do  
  read -p "输入成绩:" s
  case "$s" in
  q|Q)
      exit
      ;;
  *)
    
      if ! [[ "$s" =~ ^[0-9]+$ ]] ; then 
         echo "请输入数字"
         continue
      fi
      
      if [ $s -ge 90 -a $s -le 99 ] ; then
         echo "优秀"
      fi
      
      if [ $s -ge 80 -a $s -le 89 ] ; then
         echo "良"
      fi
      
      if [ $s -ge 70 -a $s -le 79 ] ; then
         echo "中"
      fi
      
      if [ $s -ge 60 -a $s -le 69 ] ; then
         echo "及格"
      fi
      
      if [ $s -ge 0 -a $s -le 59 ] ; then
         echo "不及格"
      fi

      ;;
  esac
done 

在这里插入图片描述

为便于系统管理员对磁盘分配的管理,请编写一段B-shell程序,当文件系统/home占用空间改变时给出相应的信息提示。要求/home占用量在系统磁盘中为:

①小于50%时,提示“用户文件系统磁盘使用负荷量小”。

②大于50%,小于90%时,提示“用户文件系统磁盘使用负荷量正常”。

③大于等于90%时,提示“用户文件系统磁盘使用负荷量偏大。

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

df -h /home > homespace1.txt

单独运行df和du命令,查看用户注册目录的空间使用情况,然后再根据此二命令的输出,决定编程的方法。
在这里插入图片描述

#!/bin/bash
df -h /home > homespace1.txt
#将/home目录占用磁盘空间的情况输出重定向到一个txt文件中去

s=`sed -n '2p' homespace1.txt`
#把homespace.txt文件里的第二行赋值给temp变量
#sed命令是利用脚本来处理文件
#-n:仅显示script处理后的结果
l=${s%'%'*}
#从右往左,把第一次出现%的右边截掉,保留左边,因为%符号有特殊含义,所以加上单引号'%',把截取后的字符串片段先赋值给m变量
r=${l##*G}

#从左往右,把字符串最后一个出现字符G的左边截掉,保留右边。这样就把占用空间百分比的数字给截取出来了,把它赋值给r变量
for i in $r
do
    if [ $i -le 50 ] ; then
        echo "用户文件系统磁盘使用负荷量小"
    fi    

    if [ $i -ge 50 -a $i -le 90 ] ; then
        echo "用户文件系统磁盘使用负荷量正常"
    fi    

    if [ $i -ge 90 ] ; then
        echo "用户文件系统磁盘使用负荷量偏大"
    fi
done


在这里插入图片描述

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

学习读取文件的方法。

在这里插入图片描述

#!/bin/bash

class="class1 class2 class3"
for i in $class
do
	total=`grep -F $i score.txt|wc -l`
	
	average=`grep -F $i score.txt|awk -F: '{sum+=$3}END{print ":",sum/NR}'`
	#在之前检索出来的一个班级的内容中截取第三列所在的内容,并进行累加得到sum,sum再除以内置变量NR(行数)就得到平均值了。
	
	echo "$i班:$total人,平均分$average。"
done

如果数据文件的内容是3个班级5门不同课程的内容,程序应该怎么调整?

#!/bin/bash

class="class1 class2 class3"
for i in $class
do
	total=`grep -F $i score1.txt|wc -l`
	echo "$i班:$total人"
	for j in 2 3 4 5 6 7
	do
		x=`sed -n '1p' score1.txt|awk -F" " '{print $'$j'}'`
		#获取第一行的内容,读取科目,便于简化操作。
		average=`grep -F $i score1.txt|awk -F" " '{sum+=$'$j'}END{print sum/NR}'`
		echo "$i$x平均分:$average"
	done
done

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

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

相关文章

JVM类加载机制

文章目录定义类加载过程加载链接验证准备解析初始化类加载器双亲委派模型定义 Java 虚拟机把描述类的数据从 Class 文件加载到内存&#xff0c;并对数据进行校验、转换解析和初始化&#xff0c;最终形成可以被虚拟机直接使用的 Java 类型&#xff0c;这个过程被称为虚拟机的类…

有手就行 -- 搭建图床(PicGo+腾讯云)

&#x1f373;作者&#xff1a;贤蛋大眼萌&#xff0c;一名很普通但不想普通的程序媛\color{#FF0000}{贤蛋 大眼萌 &#xff0c;一名很普通但不想普通的程序媛}贤蛋大眼萌&#xff0c;一名很普通但不想普通的程序媛&#x1f933; &#x1f64a;语录&#xff1a;多一些不为什么的…

2023最新最详细【接口测试总结】

序章 ​ 说起接口测试&#xff0c;网上有很多例子&#xff0c;但是当初做为新手的我来说&#xff0c;看了不不知道他们说的什么&#xff0c;觉得接口测试&#xff0c;好高大上。认为学会了接口测试就能屌丝逆袭&#xff0c;走上人生巅峰&#xff0c;迎娶白富美。因此学了点开发…

嵌入式学习笔记——SysTick(系统滴答)

系统滴答前言SysTick概述SysTick是个啥SysTick结构框图1. 时钟选择2.计数器部分3.中断部分工作一个计数周期&#xff08;从重装载值减到0&#xff09;的最大延时时间工作流程SysTick寄存器1.控制和状态寄存器SysTick->CTRL2.重装载值寄存器SysTick->LOAD3.当前值寄存器Sy…

async与await异步编程

ECMA2017中新加入了两个关键字async与await 简单来说它们是基于promise之上的的语法糖&#xff0c;可以让异步操作更加地简单明了 首先我们需要用async关键字&#xff0c;将函数标记为异步函数 async function f() {} f()异步函数就是指&#xff1a;返回值为promise对象的函…

51单片机之喝水提醒器

定时器定时器介绍晶振晶体震荡器&#xff0c;又称数字电路的“心脏”&#xff0c;是各种电子产品里面必不可少的频率元器件。数字电路的所有工作都离不开时钟&#xff0c;晶振的好坏、晶振电路设计的好坏&#xff0c;会影响到整个系统的稳定性。时钟周期时钟周期也称为振荡周期…

数据库备份

数据库备份&#xff0c;恢复实操 策略一&#xff1a;&#xff08;文件系统备份工具 cp&#xff09;&#xff08;适合小型数据库&#xff0c;是最可靠的&#xff09; 1、停止MySQL服务器。 2、直接复制整个数据库目录。注意&#xff1a;使用这种方法最好还原到相同版本服务器中&…

银河麒麟v10sp2安装nginx

nginx官网下载&#xff1a;http://nginx.org/download/ 银河麒麟系统请先检查yum源是否配置&#xff0c;若没有配置请参考&#xff1a;https://qdhhkj.blog.csdn.net/article/details/129680789 一、安装 1、yum安装依赖 yum install gcc gcc-c make unzip pcre pcre-devel …

用嘴写代码?继ChatGPT和NewBing之后,微软又开始整活了,Github Copilot X!

用嘴写代码&#xff1f;继ChatGPT和NewBing之后&#xff0c;微软又开始整活了&#xff0c;Github Copilot X&#xff01; AI盛行的时代来临了&#xff0c;在这段时间&#xff0c;除了爆火的GPT3.5后&#xff0c;OpenAI发布了GPT4版本&#xff0c;同时微软也在Bing上开始加入了A…

新版logcat最全使用指南

前言&#xff1a; 俗话说&#xff0c;工欲善其事&#xff0c;必先利其器。logcat是我们通过日志排查bug的重要武器之一。从某个版本开始&#xff0c;logcat改版了&#xff0c;改版之后&#xff0c;也许某些人觉得不太习惯&#xff0c;但是如果稍微学习下之后&#xff0c;就发现…

从 X 入门Pytorch——BN、LN、IN、GN 四种归一化层的代码使用和原理

Pytorch中四种归一化层的原理和代码使用前言1 Batch Normalization&#xff08;2015年提出&#xff09;Pytorch官网解释原理Pytorch代码示例2 Layer Normalization&#xff08;2016年提出&#xff09;Pytorch官网解释原理Pytorch代码示例3 Instance Normalization&#xff08;2…

AJAX,Axios,JSON简单了解

一. AJAX简介概念: AJAX(Asynchronous JavaScript And XML): 异步的JavaScript 和XMLAJAX作用:1.与服务器进行数据交换: 通过AJAX可以给服务器发送请求&#xff0c;并获取服务器响应的数据使用了AJAX和服务器进行通信&#xff0c;就可以使用 HTMLAJAX来替换JSP页面了2.异步交互…

ChatGPT文心一言逻辑大比拼(一)

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️&#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

静态通讯录,适合初学者的手把手一条龙讲解

数据结构的顺序表和链表是一个比较困难的点&#xff0c;初见会让我们觉得有点困难&#xff0c;正巧C语言中有一个类似于顺序表和链表的小程序——通讯录。我们今天就来讲一讲通讯录的实现&#xff0c;也有利于之后顺序表和链表的学习。 目录 0.通讯录的初始化 1.菜单的创建…

python例程:五子棋(控制台版)程序

目录《五子棋&#xff08;控制台版&#xff09;》程序使用说明程序示例代码可执行程序及源码下载路径《五子棋&#xff08;控制台版&#xff09;》程序使用说明 在PyCharm中运行《五子棋&#xff08;控制台版&#xff09;》即可进入如图1所示的系统主界面。 图1 游戏主界面 具…

一个比较全面的C#公共帮助类

上次跟大家推荐过2个C#开发工具箱&#xff1a;《推荐一个不到2MB的C#开发工具箱&#xff0c;集成了上千个常用操作类》、《推荐一个.Net常用代码集合&#xff0c;助你高效完成业务》。 今天再给大家推荐一个&#xff0c;这几个部分代码功能有重合的部分&#xff0c;大家可以根…

静态版通讯录——“C”

各位CSDN的uu你们好呀&#xff0c;之前小雅兰学过了一些结构体、枚举、联合的知识&#xff0c;现在&#xff0c;小雅兰把这些知识实践一下&#xff0c;那么&#xff0c;就让我们进入通讯录的世界吧 实现一个通讯录&#xff1a; 可以存放100个人的信息每个人的信息&#xff1a;名…

FPGA打砖块游戏设计(有上板照片)VHDL

这是一款经典打砖块游戏,我们的努力让它更精致更好玩,我们将它取名为打砖块游戏(Flyball),以下是该系统的一些基本功能:  画面简约而经典,色彩绚丽而活泼,动画流畅  玩家顺序挑战3个不同难度的级别,趣味十足  计分功能,卡通字母数字  4条生命值,由生命条显示…

智能扑克牌识别软件(Python+YOLOv5深度学习模型+清新界面)

摘要&#xff1a;智能扑克牌识别软件利用视觉方法检测和识别日常扑克牌具体花色与数字&#xff0c;快速识别牌型并标注结果&#xff0c;帮助计算机完成扑克牌对战的前期识别步骤。本文详细介绍基于深度学习的智能扑克牌识别软件&#xff0c;在介绍算法原理的同时&#xff0c;给…

[数据结构]排序算法

目录 常用排序算法的实现&#xff1a;&#xff1a; 1.排序的概念及其运用 2.插入排序 3.希尔排序 4.选择排序 5.冒泡排序 6.堆排序 7.快速排序 8.归并排序 9.排序算法复杂度及稳定性分析 10.排序选择题练习 常用排序算法的实现&#xff1a;&#xff1a; 1.排序的概念及其运用…
最新文章