Shell编程实验

article/2025/10/8 6:21:32

实验二 Shell编程

文章目录

  • 实验二 Shell编程
    • 一、如果当前目录下有文件f1,但是没有f2,解释命令ls f1 f2 2>ef1 1>&2的运行结果。
    • 二、使用for循环语句编写一段B-shell程序,完成显示用户注册目录下的a_sub, b_sub子目录下的所有C程序文件及其目标文件的列表。
    • 三、掌握shell程序执行的三种基本方式,注意调试shell程序的命令书写方式有什么不同?
    • 四、为便于系统管理员对磁盘分配的管理,请编写一段B-shell程序,当文件系统/home占用空间改变时给出相应的信息提示。要求/home占用量在系统磁盘中为:
    • 五、熟悉编程有关基础命令技巧和规则,如变量的命名,引用,位置变量及使用,输出语句及输出格式控制,输入语句和变量存储,从命令输出中提取字段值等。
    • 六、编写一段shell程序完成:根据从键盘输入的学生成绩,显示相应的成绩标准(分出不及格、及格、中、良和优秀等)。
    • 七、假设score.txt文件中保存了三个班级的学生的某门课程考试成绩,请编写一段shell程序计算每个班级的学生人数与平均分。

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

PWN@PWN-PC:~/Desktop$ ls f1 f2 2>ef1 1>&2
PWN@PWN-PC:~/Desktop$ cat ef1 
ls: 无法访问'f2': 没有那个文件或目录
f1
echo hello 1>&2 | grep aaa
#结果显示:
PWN@PWN-PC:~/Desktop$ echo hello 1>&2 | grep aaa
helloecho hello 2>&1 | grep aaa
#结果显示:
PWN@PWN-PC:~/Desktop$ echo hello 2>&1 | grep aaa
PWN@PWN-PC:~/Desktop$ echo hello 1>&2 | grep e
#结果显示:
PWN@PWN-PC:~/Desktop$ echo hello 1>&2 | grep e
helloecho hello 2>&1 | grep e
#结果显示:
PWN@PWN-PC:~/Desktop$ echo hello 2>&1 | grep e
hello

在这里插入图片描述

解释:

  • 命令的执行分正确输出和错误输出,在使用管道符的时候,管道符只接收管道符前面命令传来d正确输出,这时候就需要用2>&1改变输出类型。
  • 管道符只进行传输,不能够存储。所以在第一次2>ef1时就将得到的错误输出重定向给了文件ef1,之后再将1>&2就是把正确输出当作错误输出,然后通过管道2再写入ef1中。

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

PWN@PWN-PC:~$ pwd
/home/PWN
PWN@PWN-PC:~$ ls
Desktop  Documents  Downloads  Music  Pictures  Videos
PWN@PWN-PC:~$ mkdir a_sub b_sub
PWN@PWN-PC:~$ ls
a_sub  b_sub  Desktop  Documents  Downloads  Music  Pictures  Videos
PWN@PWN-PC:~$ touch a_sub/file{1..5}.c
PWN@PWN-PC:~$ ls -l a_sub/
总用量 0
-rw-r--r-- 1 PWN PWN 0 108 22:09 file1.c
-rw-r--r-- 1 PWN PWN 0 108 22:09 file2.c
-rw-r--r-- 1 PWN PWN 0 108 22:09 file3.c
-rw-r--r-- 1 PWN PWN 0 108 22:09 file4.c
-rw-r--r-- 1 PWN PWN 0 108 22:09 file5.c
PWN@PWN-PC:~$ touch a_sub/flag{1..3}
PWN@PWN-PC:~$ ls -l a_sub/
总用量 0
-rw-r--r-- 1 PWN PWN 0 108 22:09 file1.c
-rw-r--r-- 1 PWN PWN 0 108 22:09 file2.c
-rw-r--r-- 1 PWN PWN 0 108 22:09 file3.c
-rw-r--r-- 1 PWN PWN 0 108 22:09 file4.c
-rw-r--r-- 1 PWN PWN 0 108 22:09 file5.c
-rw-r--r-- 1 PWN PWN 0 108 22:09 flag1
-rw-r--r-- 1 PWN PWN 0 108 22:09 flag2
-rw-r--r-- 1 PWN PWN 0 108 22:09 flag3
PWN@PWN-PC:~$ touch b_sub/sys_lib{1..5}.c
PWN@PWN-PC:~$ ls -l b_sub/
总用量 0
-rw-r--r-- 1 PWN PWN 0 108 22:10 sys_lib1.c
-rw-r--r-- 1 PWN PWN 0 108 22:10 sys_lib2.c
-rw-r--r-- 1 PWN PWN 0 108 22:10 sys_lib3.c
-rw-r--r-- 1 PWN PWN 0 108 22:10 sys_lib4.c
-rw-r--r-- 1 PWN PWN 0 108 22:10 sys_lib5.c
PWN@PWN-PC:~$ 
#--------------------------
#!/bin/bash
dirlst="a_sub b_sub "
for i in $dirlst
docd $HOME/$ils -l *.cls -l flag*
done

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

  • 脚本文件本身没有权限执行,没有x权限,则使用的方法,或脚本未指定shebang,那么久用指定解释器的方法去执行。

  • 含有x权限时,就用./去执行脚本

  • 用 . 或者source去执行

  • 重定向写入,bash < shell.sh

    调试

    如何调试Shell脚本
    \1) 检查语法错误:
    一般来说我们可以通过修改shell脚本的源代码,令其输出相关的调试信息来定位错误,那有没有不修改源代码来调试shell脚本的方法呢?答案就是使用shell的执行选,下面是一些常用选项的用法:
    -n 只读取shell脚本,但不实际执行
    -x 进入跟踪方式,显示所执行的每一条命令
    -c “string” 从strings中读取命令

    “-n”可用于测试shell脚本是否存在语法错误,但不会实际执行命令。在shell脚本编写完成之后,实际执行之前,首先使用“-n”选项来测试脚本是否存在语法错误是一个很好的习惯。因为某些shell脚本在执行时会对系统环境产生影响,比如生成或移动文件等,如果在实际执行才发现语法错误,您不得不手工做一些系统环境的恢复工作才能继续测试这个脚本。

    “-c”选项使shell解释器从一个字符串中而不是从一个文件中读取并执行shell命令。当需要临时测试一小段脚本的执行结果时,可以使用这个选项,如下所示:
    sh -c ‘a=1;b=2;let c= a + a+ a+b;echo “c=$c”’

    “-x"选项可用来跟踪脚本的执行,是调试shell脚本的强有力工具。“-x”选项使shell在执行脚本的过程中把它实际执行的每一个命令行显示出来,并且在行首显示一个”+"号。 "+"号后面显示的是经过了变量替换之后的命令行的内容,有助于分析实际执行的是什么命令。 “-x”选项使用起来简单方便,可以轻松对付大多数的shell调试任务,应把其当作首选的调试手段。

    \2) 调试工具-bashdb
    使用shell调试器bashdb,这是一个类似于GDB的调试工具,可以完成对shell脚本的断点设置,单步执行,变量观察等许多功能。

    使用bashdb进行debug的常用命令
    1.列出代码和查询代码类:
    l 列出当前行以下的10行
    - 列出正在执行的代码行的前面10行
    . 回到正在执行的代码行
    w 列出正在执行的代码行前后的代码
    /pat/ 向后搜索pat
    ?pat?向前搜索pat

    2.Debug控制类:
    h 帮助
    help 命令 得到命令的具体信息
    q 退出bashdb
    x 算数表达式 计算算数表达式的值,并显示出来
    !!空格Shell命令 参数 执行shell命令
    使用bashdb进行debug的常用命令(cont.)
    控制脚本执行类:
    n 执行下一条语句,遇到函数,不进入函数里面执行,将函数当作黑盒
    s n 单步执行n次,遇到函数进入函数里面
    b 行号n 在行号n处设置断点
    del 行号n 撤销行号n处的断点
    c 行号n 一直执行到行号n处
    R 重新启动
    Finish 执行到程序最后
    cond n expr 条件断点

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

  1. 小于50%时,提示“用户文件系统磁盘使用负荷量小”。
  2. 大于50%,小于90%时,提示“用户文件系统磁盘使用负荷量正常”。
  3. 大于等于90%时,提示“用户文件系统磁盘使用负荷量偏大。

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

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

#! /bin/bash
hm=`du -s /home|cut -f 1`
#用du查询/home目录大小,参数-s指定目录,cut截取内容
rt=`df /home|grep /|tr -s [:space:]|cut -f 2 -d " "`
#用df获得/home所在磁盘的大小,tr将不一致的间隔缩小成一个间隔,cut截取内容。
let ret=hm*100/rt
#用let运算,计算占比,因为let是整除而且不会显示小数,所以先乘一个100。
#调试:echo "$hm,$rt,$ret"
#调试:ret=30
case $ret in9[0-9])echo "用户文件系统磁盘使用负荷量偏大";;[5-8][0-9])echo "用户文件系统磁盘使用负荷量正常";;[0-4][0-9]|[0-9]) echo "用户文件系统磁盘使用负荷量小";;
esac

五、熟悉编程有关基础命令技巧和规则,如变量的命名,引用,位置变量及使用,输出语句及输出格式控制,输入语句和变量存储,从命令输出中提取字段值等。

变量

  • 变量定义与赋值时,变量与值之间不得有空格:var=“abcd”

    无需声明类型,且bash默认把所有变量都认为是字符串

  • 变量的打印:echo $var 、echo ${var}

  • 变量命名规则:

    1. 见名知意
    2. 只能包含数字、字母、下划线
    3. 不能以数字开头
    4. 不能用标点符号
    5. 变量名严格区分大小写
  • 变量的作用域:切换shell变量会丢失

    1. 本地变量,只存在于当前shell中,定义shell变量时变量名不需要加$符,本地变量只在用户当前shell生存期中有效

    2. 环境变量,全局变量,针对当前shell以及其任意子进程,环境变量也分自定义内置两种环境变量

    3. 局部变量:针对在shell函数或是shell脚本中定义的

    4. 位置参数变量:用于shell脚本中传递的参数(相当于命令执行时的参数、路径这种)

    5. 特殊变量:shell内置的特殊功效变量

      $0:获取shell脚本文件名,以及脚本路径

      $n:获取shell脚本的第n个参数,n在1~9之间,如$1,$2, 9 , 大于 9 则需要写 9,大于9则需要写 9,大于9则需要写{10},参数空格隔开

      $#:获取执行的shell脚本后面的参数总个数

      ∗ :获取 s h e l l 脚本所有参数,不加引号等同于 *:获取shell脚本所有参数,不加引号等同于 :获取shell脚本所有参数,不加引号等同于@作用,加上引号"$ *"作用,其主要用于接收参数为单个字符串“$1 $2 $3 $4 $5 $6 $7”

      $@:不加引号,效果同上,加上引号,是接收所有参数为独立字符串“$1” “$2” “$3” “$4” “$5” “$6” “$7”

    6. 特殊状态变量

      $?:这是一个状态变量,如果上一次的命令执行成功就会是0,错误1-255(错误码)

      echo $?:在脚本中用于查看是否执行成功某条指令

      $$:取得当前shell脚本的进程号

      $!:上一次后台进程的PID

      $_:取得上一次执行命令的最后一个参数

    7. 自定义变量

  • 引号变量

    1. 单引号变量,不识别特殊语法
    2. 双引号变量,能识别特殊符号
    3. 反引号变量,会将变量值识别为命令,且将命令执行的结果作为变量的值存储起来

    调用bsh解释器执行脚本,都会开启一个子shell,因此不保留当前的shell变量;

    调用source或者.符号,在当前shell环境下加载脚本,因此保留变量

  • 环境变量设置

    环境变量一般指的是用export内置命令导出的变量,用于定义shell的运行环境,保证shell命令的正确执行。

    shell通过环境变量确定登录的用户名、PATH路径、文件系统等各种应用。

    环境变量可以在命令行中临时创建,但是用户退出shell终端,变量就会丢失,如果要永久生效,需要修改环境变量配置文件。

    • 用户个人配置文件在:~/.bash_profile、 ~/.bashrc 远程登录用户特有文件

    • 全局配置文件/etc/profile 、 /etc/bashrc ,且系统建议最好创建在/etc/profile.d,而非直接修改主文件,修改全局配置文件,影响所有登录系统的用户

      优先用户自己配置的环境变量,其次才是全局变量

    • 检查系统环境变量的命令

      1. set,输出所有变量,包括全局变量、局部变量

        set |wc -l: 可以显示总行数

        set |grep ^name:找到以name开头的变量

      2. env,只显示全局变量

      3. declare,输出所有的变量,同set

      4. export,显示和设置环境变量值

    • 撤销环境变量、删除变量或函数:unset 变量名

    • 设置只读变量:readonly age=18,设置好之后变量不能再被修改,当shell结束,只读变量才失效。

      过滤出环境变量中的所有环境变量的名字:

      export | awk -F ‘[:=]’ ‘{print $3}’

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

#!/bin/shread a
case $a in9[0-9]|100)echo "优秀";;8[0-9])echo "良";;7[0-9])echo "中";;6[0-9])echo "及格";;[0-5][0-9])echo "不及格";;*) echo "Wrong content!";;esac

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

学习读取文件的方法。

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

#!/bin/sh
#这个程序的操作与目标文件中的内容格式关系很大,就是根据文件内容格式来进行的操作class="计科201 计科202 计科203"
for i in $class
dototal=`grep -F $i score.txt|wc -l`#以班级为关键词检索出相关行(grep -F $i)并统计行数(wc -l),行数即是人数。average=`grep -F $i score.txt|awk -F: '{sum+=$3}END{print ":",sum/NR}'`#在之前检索出来的一个班级的内容中截取第三列所在的内容,并进行累加得到sum,sum再除以内置变量NR(行数)就得到平均值了。echo "$i班:$total人,平均分$average。"
done
#文本格式
计科201:a:75
计科202:b:76
计科201:c:77
计科203:d:78
计科202:e:79
计科203:f:80
#!/bin/shclass="计科201 计科202 计科203"
for i in $class
dototal=`grep -F $i score1.txt|wc -l`echo "$i班:$total人"for j in 3 4 5 6 7dox=`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
#文件内容格式
班级 姓名 语文 数学 英语 计算机 网络攻防
计科201 a 110 130 125 99 100
计科201 b 99 101 145 80 75
计科201 c 107 112 126 68 60
计科201 d 113 135 140 95 95
计科202 e 121 140 130 68 52
计科202 f 111 150 30 56 32
计科202 g 141 123 86 23 51
计科202 h 90 25 35 60 75
计科202 i 51 36 85 62 34
计科203 j 134 62 140 55 66
计科203 k 111 112 113 70 71
计科203 l 142 143 144 99 100
计科203 m 150 150 150 100 100
计科203 n 100 100 100 100 100
计科203 o 101 101 101 101 101

http://chatgpt.dhexx.cn/article/w0YahhRY.shtml

相关文章

Shell编程入门

文章目录 1 Shell编程简介2 Shell脚本的执行方式3 Shell变量3.1 Shell变量介绍3.2 定义变量的规则3.3 将命令的返回值赋给变量&#xff08;重点&#xff09; 4 设置环境变量5 位置参数变量6 预定义变量7 运算符8 条件判断8.1 基本介绍8.2 if 判断8.3 case 语句 9 循环语句9.1 f…

Linux Shell编程

Linux Shell编程 一、简述 简单的介绍shell脚本的基本用法。 shell脚本是 由一些按照一定格式组合起来的shell命令 组成。shell脚本不需要编译就可以直接执行&#xff0c;它是边解释边执行的。 二、命令解释器 Linux系统提供多种不同的Shell以供选择。常用的有Bourne Shell&a…

Shell编程入门学习

文章目录 Shell编程Shell脚本的执行方式Shell的变量Shell的变量的介绍shell变量的定义 设置环境变量位置参数变量介绍基本语法 预定义变量基本介绍基本语法 运算符基本语法 条件判断判断语句常用判断条件 流程控制if 判断case语句for循环while循环 read读取控制台输入基本语法 …

shell编程

文章目录 一、shell简介二、shell脚本的执行方式三、shell变量3.1 shell变量介绍3.2 shell变量的定义3.2.1 基本语法3.2.2 定义变量的规则3.2.3 将命令的返回值赋予变量 四、环境变量的设置五、位置参数变量5.1 基本介绍5.2 基本语法 六、预定义变量6.1 基本介绍6.2 基本语法 七…

shell编程入门(一天掌握shell编程)

一、背景 到新公司之后&#xff0c;发现好多地方需要使用shell来编写一些简单的程序来提升自己的工作效率&#xff0c;因此专门B站上查看视频&#xff08;尚硅谷的视频&#xff09;&#xff0c;在这里学习总结下shell编程。 二、shell概述 shell是一个命令行解释器&#xff…

Linux【实操篇】—— Shell 编程入门、变量、运算符、条件判断、流程控制

目录 一、Shell 编程入门 1. 认识 Shell 2. Shell 脚本的创建与执行 二、Shell 变量 1. 系统变量和自定义变量 2. 变量的基本规则 3. 设置环境变量 4. 位置参数变量 5. 预定义变量 三、运算符 四、条件判断 五、流程控制 1. if 语句 2. case 语句 3. fo…

各大常见OJ与推荐OJ汇总(OJ题量统计)

这么长时间了 收集了不少做题的网站 在这里列一列 可以挑自己各方面都喜欢的主用 并没有什么顺序 大家择优选择 Last-Modified: 2023/3 POJ&#xff08;北京大学&#xff09;洛谷CowcoderLibreOJCodeforces&#xff08;俄罗斯&#xff09;东北大学秦皇岛分校oj51Nodhihocoder…

华为OD机试(2023A+B)在线OJ模拟

语言支持 CCJavaJavaScript&#xff08;Node.js-CJS、Node.js-ESM&#xff09;Python&#xff08;Python3、PyPy3、Python3-Graphics&#xff09;Mono C#GoRubyRustSQLHaskellBashJuliaKotlin/JVMFortranPascalPHPVerilog 用例库说明 在线OJ中的题目用例均来自本人构思&#…

在线OJ注意事项

CSDN话题挑战赛第2期 参赛话题&#xff1a;学习笔记 一、OJ概念 online judge&#xff0c;简称OJ&#xff0c;是一个在线的判题系统。 用户可以在线提交多种程序代码(比如&#xff1a;C、C、Java、Python等)&#xff0c;系统对源代码进行编译和执行&#xff0c;并通过预先设计…

在线OJ系统

在线OJ系统 项目开始之前需要准备的第三方库项目分析 两大模块在线编译模块整体思路编译模块 题目管理模块数据存储页面显示服务器 项目开始之前 需要准备的第三方库 httplib g版本必须得是4.9以上 ctemplate boost&#xff1a; yum install boost-devel.x86_64 jsoncpp&a…

分享一个OJ平台——浙江工商大学的OJ平台

1.引言 最近是有总喜欢讨论算法题&#xff0c;因为他们在准备考研复试&#xff0c;为什么我不准备呢&#xff1f;这是一个悲伤的故事&#xff0c;刚好自己也有面试遇到只能使用C和C的代码题&#xff0c;他们说这OJ平台相对简单一些&#xff0c;那些刷不来LeetCode可以试试这个&…

算法OJ题(1)

1.删除有序数组中的重复项 原题链接&#xff1a;https://leetcode.cn/problems/remove-duplicates-from-sorted-array/ 思路&#xff1a;使用双指针算法可以使时间复杂度达到O(1). 具体过程&#xff1a;&#xff08;以画图解释&#xff09; 代码实现&#xff1a; int remove…

你想知道刷题的秘密吗?一篇博客让你明白什么是OJ题,如何刷OJ题,并深入浅出的带你刷遍顺序表的OJ题(小白必看)

目录 0.前言 1.什么是OJ 1.1 OJ简述 1.2 OJ的分类&#xff08;尤其接口型OJ&#xff0c;带你剖析得明明白白&#xff09; 1.3 接口型OJ的输入型参数 2. 剑指 Offer 56 - I. 数组中数字出现的次数 3. 88. 合并两个有序数组 4. 27.移除元素 5. 26. 删除有序数组中的重复…

Online Judge系统(简称OJ)

什么是OJ Online Judge系统&#xff08;简称OJ&#xff09;是一个在线的判题系统。用户可以在线提交程序源代码&#xff0c;系统对源代码进行编译和执行&#xff0c;并通过预先设计的测试数据来检验程序源代码的正确性。 一个用户提交的程序在Online Judge系统下执行时将受到比…

OJ的介绍以及使用方法

OJ系统简介 Online Judge系统&#xff08;简称OJ&#xff09;是一个在线的判题系统。用户可以在线提交程序多种程序&#xff08;如C、C&#xff09; 源代码&#xff0c;系统对源代码进行编译和执行&#xff0c;并通过预先设计的测试数据来检验程序源代码的正确性。 一个用户提…

C++-OJ

题目源自某高校C的OJ 本文字数过多&#xff0c;所有代码&#xff0c;都在这里 将做过的C OJ题目整理合并了一下&#xff0c;总共有一百多道题目&#xff0c;手动合并自然是不可能的 这个时候我们就可以使用shell脚本来取代这种机械化的重复劳动了&#xff0c;由于写成博客需要…

杭电OJ刷题指南(ACM)

除了杭电OJ&#xff0c;还有北大OJ&#xff0c;华科OJ等。 1.首先&#xff0c;打开百度&#xff0c;输入“杭电OJ”进行搜索 2.然后进入杭电OJ官网&#xff0c;进行注册 3.输入注册信息 4.接下来进入详细注册界面&#xff0c;将信息填写完整后点击Submit 5.接下来即可登录…

OJ系统

什么是OJ Online Judge系统&#xff08;简称OJ&#xff09;是一个在线的判题系统。用户可以在线提交程序源代码&#xff0c;系统对源代码进行编译和执行&#xff0c;并通过预先设计的测试数据来检验程序源代码的正确性。 一个用户提交的程序在Online Judge系统下执行时将受到比…

最适合编程训练的三大OJ(从易到难)

按照学习的需求来说依次介绍&#xff0c;方便初学者使用&#xff1a; 1.Dotcpp网www.dotcpp.com 优点&#xff1a;全中文OJ&#xff0c;题目分类&#xff0c;有题解 这可能是初学者最好用的OJ甚至没有之一了 全中文的友好操作&#xff0c;充足的语法基础题、二级C语言题、…

各大OJ刷题平台汇总

前言 想成为一名高级工程师&#xff0c;算法还是要有的&#xff0c;至少在入门编程和进入公司之前都是必备的。刷题也可以很好的锻炼动手能力和逻辑思维&#xff0c;今天就给大家介绍一些知名的在线刷题平台,都是干货哦&#xff01; 力扣(leetcode) 江湖人尽皆知的站点&#xf…