Sy7 shell编程-1

实验环境:

宿主机为win11,网络:10.255.50.5 6389

WSL2 ubuntu

目标机的OS:Ubuntu 内核、版本如下:

linux@peggy0223:/$ uname -r

5.15.146.1-microsoft-standard-WSL2

linux@peggy0223:/$ cat /proc/version

Linux version 5.15.146.1-microsoft-standard-WSL2 (root@65c757a075e2) (gcc (GCC) 11.2.0, GNU ld (GNU Binutils) 2.37) #1 SMP Thu Jan 11 04:09:03 UTC 2024

实验7 shell 编程

1.实验目的

1)掌握shell 编程的技巧和方法。

2)进一步练习编写shell程序。

2.shell命令、变量和控制结构

这些部分请参阅教材和课件。

3.实验内容

1)、编写一个shell脚本程序,打印出班级总成绩排名在前3名(按总成绩递增)学生的姓名、学号和成绩。打印输出的格式(姓名、学号、第1、2、3门课程成绩及总成绩)如下:

zhang san 23 40 70 60 170

wang wu 31 60 60 80 200

li si 2 100 50 90 240

学生成绩文件自己创建。

2)、编写一个menu的shell脚本程序,执行后的界面为:

Number     Name     For     Linux     Menu

1                   exit      leave menu or return

2                   menu   goto another local menu

3                   vi          edit a file

4                   mail     read a mail

5                   send    send mail to someone

6                   cal        see your calendar

7                   who     see who is on the system

8                   ls          list the files in this directory

9                   cat       display a file on the screen

=====================================

Please enter a number or a name for the action you wish:

要求有清屏功能,能正确地执行各项命令并显示。

----------------

编写这样一个带清屏功能的Linux Shell菜单脚本,你可以使用以下代码作为基础。这个脚本将利用`clear`命令来清屏,并通过用户输入的数字或命令名称来执行相应的操作。

```bash

#!/bin/bash

# 定义菜单选项及其对应的操作

declare -A menu_options=(

    [1]="exit"

    [2]="menu" # 如果有其他子菜单的话

    [3]="vi"

    [4]="mail"

    [5]="send"

    [6]="cal"

    [7]="who"

    [8]="ls"

    [9]="cat"

)

function clear_screen {

    clear || printf "\033c" # 使用clear命令或者兼容的ANSI转义序列清屏

}

function display_menu {

    clear_screen

    echo "Number     Name     For     Linux     Menu"

    echo "====================================="

    echo "1         exit      leave menu or return"

    echo "2         menu   goto another local menu"

    echo "3         vi          edit a file"

    echo "4         mail     read a mail"

    echo "5         send    send mail to someone"

    echo "6         cal        see your calendar"

    echo "7         who     see who is on the system"

    echo "8         ls          list the files in this directory"

    echo "9         cat       display a file on the screen"

    echo "====================================="

    echo -n "Please enter a number or a name for the action you wish: "

}

display_menu

while true; do

    read -r choice

    if [[ ${menu_options[$choice]} ]]; then

        # 执行对应编号的命令

        eval "${menu_options[$choice]}"

    elif [[ $(type -t $choice) == "file" ]]; then

        # 如果输入的是可执行文件名,则尝试直接执行

        "$choice"

    elif [[ -n "$(which $choice)" ]]; then

        # 如果输入的是外部命令,则执行外部命令

        "$choice"

    else

        echo "Invalid input. Please enter a valid number or command."

        display_menu

    fi

    # 继续循环,除非用户选择退出

    [[ $choice == "exit" ]] && break

done

# 清除屏幕后退出

clear_screen

```

**注意**:

- 上述脚本中,“goto another local menu”目前只是一个占位符,因为它没有实际的菜单跳转功能。

- 对于诸如`mail`、`send`、`cat`这样的命令,它们默认情况下并不会提供任何参数,因此实际执行时可能需要用户提供额外的参数才能正常工作。

- `eval`用于执行菜单中定义的命令,但请注意使用`eval`有安全风险,应确保用户输入可控且不会导致恶意命令被执行。

要在实际环境中运行此脚本,请先保存为`.sh`文件(例如:`menu.sh`),赋予其执行权限(如`chmod +x menu.sh`),然后通过命令行执行(如`./menu.sh`)。

----------------

如何执行shell script呢?(./sh的使用区别)

1、使用“./”执行脚本,对应的xxx.sh脚本必须要有执行权限;

2、使用“sh” 执行脚本,对应的xxx.sh没有执行权限,亦可执行;

3、当脚本开头使用#!设置使用的shell类型时,使用“./”执行脚本时,则使用“#!”标志的shell执行脚本;若无使用“#!”标记,则使用系统设置的默认shell执行脚本;

----------------

脚本中几种引号的区别:

单引号''双引号""反向单引号``  ---[英文输入法输入的]

单引号‘’双引号”“反向单引号(中文无法输出)    ---[中输入法输入的]

单引号 ' '

  • 六亲不认,单引号中的所有内容都被认为是字符串

双引号 " "

  • 双引号可以识别变量,不能识别命令

反向单引号 ` `

  • 即能识别其中的命令,又能识别其中的变量,但不支持嵌套
  • 聪明的孩子总是比较反叛

----------------

4.实验报告

说明程序设计的数据结构,画出流程图 编写源程序,在虚拟机上调试通过。

5.思考题

查阅资料,总结shell编程的特点、技巧。

理论知识点补充下:

  位置参数和专用参数的例子:

位置参数

一组特殊的内置变量

  • 跟在脚本名后面的用空格隔开的每个字符串
  • $1 表示第1个参数值,……$9 表示第9个参数值
  • ${10} 表示第10个参数值, ${11} 表示第11个参数值, ……

位置参数的用途

  • shell 命令/脚本 的命令行接受参数
  • 在调用 shell 函数时为其传递参数

专用参数

命令行参数相关

  • $*        将所有位置参量看成一个字符串(以空格间隔) 。
  • $@      将每个位置参量看成单独的字符串(以空格间隔)。
  •  “$*”   将所有位置参量看成一个字符串(以$IFS间隔)。
  •  “$@” 将每个位置参量看成单独的字符串(以空格间隔) 。
  • $0       命令行上输入的Shell程序名。
  • $#       表示命令行上参数的个数。

进程状态相关

  • $?  表示上一条命令执行后的返回值
  • $$  当前进程的进程号
  • $!   显示运行在后台的最后一个作业的 PID
  • $_  在此之前执行的命令或脚本的最后一个参数

退出状态

  • $?返回上一条语句或脚本执行的状态
    • 0:成功
    • 1255:不成功
  • exit 命令用于退出脚本或当前Shell
    • n 是一个从 0 255 的整数
    • 0 表示成功退出,非零表示遇到某种失败
    • 返回值 被保存在状态变量 $?

<<ifsarg.sh>>

使用bash执行:bash vartest.sh 1 ‘2 3’ 4 5 a b c d e f g

执行:bash vartest.sh 1 '2 3' 4 5 a b c d e f g

------------------

<<vartest.sh>>

使用bash执行:bash ifsarg.sh 1 ‘2 3’ 4 5 a b c d e f g

------------------

<<t_shift.sh>>

使用bash执行:bash t_shift.sh 1 a 3 b 5 c 7

执行:bash t_shift.sh a ‘1 2 4’ c 5 e 9

-------------------

wins编辑的sharelinux中的运行出现提示符的注意事项:

wins手动编辑的:

#!/bin/sh

# This script demonstrates variables and the 'shift' command in shell

echo "example!!!"

WOW="hi,boy"

DX1A='YGU-dx1a'

clear

echo " $WOW, My name is beautiful girl from $DX1A"

echo "Home Directory: $HOME"

echo "command line here is:"

echo "$0 $*"

echo "Before shift operation"

echo "No. of arguments = $#"

echo "All the arguments: $*"

echo "\$0 = $0, \$1 = $1, \$2 = $2"

shift                

echo "After one shift operation"

echo "No. of arguments: $#"

echo "All the arguments: $*"

echo "\$0 = $0, \$1 = $1, \$2 = $2"

然后运行bash variable.sh 1 3 5 7 9

出现以下错误:clear\rcommand not found

查找了原因:

是 Windows 和 Linux 的 .sh 脚本文件格式不同,如果在脚本中有空行,脚本是在 Windows 下进行编辑之后上传到 linux 上去执行的话,就会出现这个问题。

windows 下的换行符是\r\n,而 linux 下的换行符是\n,没有识别/r,所以会导致上述的报错,这个属于脚本编码的问题。

解决方式:

vim

:set ff=unix回车

ESC : wq保存退出后再运行显示正常:

同理,其他在wins下copy过去/编辑的都需要:set ff=unix后,可执行:

./2greet.sh和bash 2greet.sh实现相同的结果(前置需要+x权限)

如下图所示,在输入vi 2greet.sh后输入了:set ff=unix回车,然后esc : wq退出。

 greet.sh也是如下:

文档结束。

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

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

相关文章

Java | Leetcode Java题解之第22题括号生成

题目&#xff1a; 题解&#xff1a; class Solution {static List<String> res new ArrayList<String>(); //记录答案 public List<String> generateParenthesis(int n) {res.clear();dfs(n, 0, 0, "");return res;}public void dfs(int n ,int…

动态规划应用

介绍 是用来解决一类最优问题的算法思想&#xff0c;将一个复杂的问题分解成若干个子问题&#xff0c;通过综合子问题的最优解得到。 递归写法实例 优化斐波那契数列 int F(int n){if(n0||n1) return 1;else{return F(n-1)F(n-2);}有太多重复计算&#xff0c;可用一个数组记…

oracle数据库怎么查看当前登录的用户?

方法如下&#xff1a; 输入select * from dba_users; 即可。 常用语句&#xff1a; 一&#xff0c;查看数据库里面所有用户&#xff1a; select * from dba_users; 前提是你是有dba权限的帐号&#xff0c;如sys,system。 二&#xff0c;查看你能管理的所有用户&#xff1…

.[[backup@waifu.club]].svh勒索病毒数据怎么处理|数据解密恢复

尊敬的读者&#xff1a; 近年来&#xff0c;随着信息技术的迅猛发展&#xff0c;网络安全问题日益凸显&#xff0c;其中勒索病毒成为了一大威胁。.[[backupwaifu.club]].svh、.[[MyFilewaifu.club]].svh勒索病毒就是其中之一&#xff0c;它以其独特的传播方式和恶劣的加密手段…

Spring AMQP消息中间件

SpringAMQP简单说就是一个中间件&#xff0c;提供了模板方便我们操作各种消息模型 上面已经学了RabbitMQ消息队列是有五种消息模型&#xff0c;并且我们演示了其中的基本消息队列(Hello World)。用的是官方API&#xff0c;来实现的基本消息队列(Hello World)。会发现官方提供的…

华为OD-C卷-攀登者1[100分]

攀登者喜欢寻找各种地图,并且尝试攀登到最高的山峰。 地图表示为一维数组,数组的索引代表水平位置,数组的元素代表相对海拔高度。其中数组元素0代表地面。 例如: [0,1,2,4,3,1,0,0,1,2,3,1,2,1,0],代表如下图所示的地图 地图中有两个山脉位置分别为 1,2,3,4,5 和 8,9,1…

一、OpenCvSharp环境搭建

一、Visual Studio 创建新项目 二、选择Windows窗体应用&#xff08;.NET Framework&#xff09; 直接搜索模板&#xff1a;Windows窗体应用(.NET Framework) 记得是C#哈&#xff0c;别整成VB(Visual Basic)了 PS&#xff1a;若搜索搜不到&#xff0c;直接点击安装多个工具和…

K8S哲学 - 常见的资源类型

资源类型 namespace kubectl apply 和 kubectl create kubectl apply是声明式的 和 kubectl create是命令式的对吗 deployment 和 job的区别

Fiddle配置代理,保手机模拟器访问外部网络

前言&#xff1a; 嘿&#xff01;大家好&#xff01;我来带你们玩转Fiddler和Mumu模拟器的组合技了&#xff01;此组合技能帮助你实现在模拟器上畅游外部网络。相信我&#xff0c;它会让你的开发和测试过程更加轻松愉快&#xff01;废话不多说&#xff0c;赶紧展开我们的冒险吧…

bugku-web-file_get_contents

<?php extract($_GET); if (!empty($ac)){$f trim(file_get_contents($fn));if ($ac $f){echo "<p>This is flag:" ." $flag</p>";}else{echo "<p>sorry!</p>";} } ?> 这里涉及到几个不常用的函数 这里直接构…

22.04 忘记root密码

在即将加载Ubuntu启动界面时&#xff0c;在 GRUB 引导菜单出现之前马上按住 Shift 键&#xff0c;将进入引导菜单 在引导菜单中选择 “Advanced options for Ubuntu”&#xff0c;如果是中文则显示为“Ubuntu高级选项” 接下来你会看到好几个内核版本号&#xff0c;按上下键选…

区块链安全-----接口测试-Postman

Postman是一款支持http协议的接口调试与测试工具&#xff0c;其主要特点就是功能强大&#xff0c;使用简单且易 用性好 。无论是开发人员进行接口调试&#xff0c;还是测试人员做接口测试&#xff0c;Postman都是我们的首选工具 之一 。 更早的接入测试&#xff0c;更早的发现问…

数据结构与算法

根据希赛相关视频课程汇总整理而成&#xff0c;个人笔记&#xff0c;仅供参考。 数据结构 包括逻辑结构和物理结构 线性表 一对一的关系 栈/队列&#xff1a;操作受限的线性表 串&#xff1a;由零个或多个任意字符组成的有限序列 S“a1, a2, …, an” (n≥0) 串长度&#…

69787987

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

实现智能水控 | 基于ACM32 MCU的分体式水控方案

分体式水控概述 分体式水控是一种常见的水控系统&#xff0c;它的工作原理是通过水的流动来控制水的供应和排放&#xff0c;该系统一般由两部分组成&#xff1a;控制器和水阀。控制器负责监测水的流量和压力&#xff0c;根据设定的参数来控制水阀的开和关&#xff0c;从而实现水…

何谓电子邮件加密?探讨其工作原理及多种加密形式的运用

在现今信息化社会&#xff0c;电子邮件已经成为日常生活与商务活动中无可替代的通讯手段&#xff0c;每日全球往来邮件的数量高达数十亿封&#xff0c;这些邮件中往往包含了个人隐私信息、账户密码、金融交易详情、法律文件、专利技术等内容&#xff0c;一旦落入网络不法分子之…

Amazon Bedrock 实践系列 | Claude 3 深度探秘

生成式 AI 和大模型在 2024 年已经进入落地实践阶段。因此&#xff0c;围绕开发者在生成式应用程序开发中的主要痛点和需求&#xff0c;我们组织了这个 “Amazon Bedrock 实践” 的系列&#xff0c;希望可以帮助开发者高效地上手生成式 AI 和大模型的应用开发。本篇为第二篇&am…

JavaWeb-Ajax

文章目录 1.基本介绍2.应用场景3.两种通信方式对比1.传统web通信方式2.Ajax通信方式 4.原生Ajax1.快速入门1.案例2.创建maven项目&#xff0c;导入依赖3.编写代码1.User.java2.login.html3.CheckUserServlet.java4.结果 4.后置资料5.课后作业——接入DB1.导入依赖2.创建德鲁伊连…

一些优雅的算法(c++)

求最大公约数&#xff1a;辗转相除法 int gcd(int a,int b){return b0?a:gcd(b,a%b); }求最小公倍数&#xff1a;两整数之积除以最大公约数 int lcm(int a, int b){return a*b / gcd(a, b); }十进制转n进制&#xff1a; char get(int x){if(x<9){return x0;}else{return…

【Mybatis-Plus】Mybatis-Plus增删改查示例

示例一&#xff1a;delete 这个删除&#xff0c;是我们直接可以把这条记录给放进去&#xff0c;那么这条记录里面如果说有的属性为空的话&#xff0c;它是不会去管的&#xff0c;但是有些属性它不为空的话&#xff0c;那么它就会根据属性。作为一个equal的条件去做一个删除的一…