# linux 自测 1. 本课程需要使用类 Unix shell,例如 Bash 或 ZSH。如果您在 Linux 或者 MacOS 上面完成本课程的练习,则不需要做任何特殊的操作。如果您使用的是 Windows,则您不应该使用 cmd 或是 Powershell;您可以使用Windows Subsystem for Linux或者是 Linux 虚拟机。使用 `echo $SHELL` 命令可以查看您的 shell 是否满足要求。如果打印结果为 `/bin/bash` 或 `/usr/bin/zsh` 则是可以的。 2. 在 `/tmp` 下新建一个名为 `missing` 的文件夹。 3. 用 `man` 查看程序 `touch` 的使用手册。 4. 用 `touch` 在 `missing` 文件夹中新建一个叫 `semester` 的文件。 5. 将以下内容一行一行地写入 `semester` 文件: ``` #!/bin/sh curl --head --silent https://missing.csail.mit.edu ``` 第一行可能有点棘手, `#` 在 Bash 中表示注释,而 `!` 即使被双引号(`"`)包裹也具有特殊的含义。 单引号(`'`)则不一样,此处利用这一点解决输入问题。更多信息请参考 Bash quoting 手册 1. 尝试执行这个文件。例如,将该脚本的路径(`./semester`)输入到您的 shell 中并回车。如果程序无法执行,请使用 `ls` 命令来获取信息并理解其不能执行的原因。 2. 查看 `chmod` 的手册(例如,使用 `man chmod` 命令) 3. 使用 `chmod` 命令改变权限,使 `./semester` 能够成功执行,不要使用 `sh semester` 来执行该程序。您的 shell 是如何知晓这个文件需要使用 `sh` 来解析呢?更多信息请参考:shebang 4. 使用 `|` 和 `>` ,将 `semester` 文件输出的最后更改日期信息,写入主目录下的 `last-modified.txt` 的文件中 5. 写一段命令来从 `/sys` 中获取笔记本的电量信息,或者台式机 CPU 的温度 6. 使用shell编程写一个类似脚本的图书管理系统,包含增删改查四个功能 当然,可能会有点困难我在这里附上一段参考代码 ```shell #! /usr/bin/env bash initialization() { echo -n "| " ;echo "1:添加图书" echo -n "| " ;echo "2:删除图书" echo -n "| " ;echo "3:显示馆藏图书" echo -n "| " ;echo "4:查找图书" echo -n "| " ;echo "5:退出系统" mainmenu } mainmenu() { read operation case $operation in 1) addbook ;; 2) delbook ;; 3) listbooks ;; 4) search ;; 5) exit ;; *) "无效操作,请重试。" initialization ;; esac } #直接在文件夹内添加书(所以没有 书单.txt),若没有就find遍历系统匹配并加入 #不考虑系统中多个匹配结果的情况 addbook() { echo "添加图书" echo "-------------------------" read -p "输入添加的书名" bookname if [[ -f ~/Desktop/bookregister/$bookname ]] ; then echo "已经存在这本书。" return else find ~ -name $bookname -exec mv {} ~/Desktop/bookregister \; if [[ -f ~/Desktop/bookregister/$bookname ]] ; then echo "匹配成功,已加入书单。" else read -p "未找到这本书,手动输入链接从网上下载?[y/n]" download if [[ $download = 'y' ]] ; then read -p "请输入链接。" url curl ${url} -o $bookname find ~ -name $bookname -exec mv {} ~/Desktop/bookregister \; fi fi fi } delbook() { echo "删除图书" echo "-------------------------" read -p "输入删除的书名" bookname if [[ ! -f ~/Desktop/bookregister/$bookname ]] ; then echo "查无此书。" return else read -p "输入 delete 以确认。" delete if [[ $delete = delete ]]; then rm ~/Desktop/bookregister/$bookname echo "删除完毕。" fi fi } #因为脚本图书放在一起,所以脚本自身也会显示(不要在意这些细节) listbooks() { ls ~/Desktop/bookregister } #若找到直接用less打开 search() { echo "查找图书" echo "-------------------------" read -p "输入查找的书名" bookname if [[ -f ~/Desktop/bookregister/$bookname ]] ; then less ~/Desktop/bookregister/$bookname else echo "查无此书。" fi } ```