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 表示成功退出,非零表示遇到某种失败
    • 返回值 被保存在状态变量 $?
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个在高校打杂的

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值