实验环境: 宿主机为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编程的特点、技巧。 |
理论知识点补充下:
位置参数和专用参数的例子:
<<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编辑的share到linux中的运行出现提示符的注意事项: wins手动编辑的:
然后运行bash variable.sh 1 3 5 7 9 出现以下错误:clear\r:command 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也是如下: 文档结束。 |