操作系统原理实验
实验1 linux基础操作
!本文为个人的实验总结,仅包含在校时上机实验所涉及的操作,并不包含所有的linux命令!
一、Linux基本命令
任务1:使用pwd命令查看当前目录。
任务2:使用ls命令以详细列表的形式查看有关当前目录的信息。
执行命令:
$ pwd
$ ls -l -h
(-l 中 l 代表long 意为详细展示,-h 中 h 意味以人类易理解的方式展示 比如内存显示以k为单位)。
命令执行结果截图:
任务3:使用man命令获取less命令的帮助信息,并将其保存到文件less.txt。
执行命令:
$ man less
$ man less > less.txt
" > (文件名)" 意为将前者的运行重定向到指定文件中,在这里指的是创建less.txt并将前者的运行结果保存在less.txt中
命令执行结果截图:
任务4:在当前目录中创建D1子目录。
执行命令:
$ mkdir D1
默认是在当前终端所在目录下创建文件夹。
命令执行结果截图:
任务5:使用cp命令将/etc/profile文件复制到D1目录,文件名为profile.bak。
执行命令:
$ cp ../../etc/profile profile.bak
" ../../etc/profile" 指的是所在文件的地址。
" profile.bak" 为粘贴后的文件名,此文件默认是在终端所在文件夹中创建。
命令执行结果截图:
任务6:使用less命令查看profile.bak文件的内容
执行命令:
$ less profile.bak
命令执行结果截图:
任务7:在现有系统上查找后缀为.cfg的所有文件,并将结果保存在/root/cfginfo.txt中。
执行命令:
$ find ../ -name ‘*.cfg’ > cfginfo.txt
" find "为寻找指定类型的文件
" ../ " 表示定义到根目录(当前为/root,上一层为根目录)
" -name ‘*.cfg’ "意思为以指定后缀为.cfg的文件
" > cfginfo.txt " 意思为将前面代码的运行结果输出到当前终端所在目录下的cfginfo.txt中
命令执行结果截图:
任务8:编辑上述cfginfo.txt,在vim编辑器的txt文件中,在文件的第一行插入“This is CFG file information”(这是CFG文件信息)并保存。
执行命令:
$ vi cfginfo.txt
" vi cfginfo.txt " 意思是用vim编辑器打开cfginfo.txt这个文件 , 利用vim编辑器对该文件进行编辑 。
在vim编辑器中,按i、o、a均可进入编辑模式;Esc键为退出编辑模式;" :wq " 实现文件的保存+退出功能。
命令执行结果截图:
任务9:使用cat命令查看编辑后的cfginfo.txt文件。
执行命令:
$ cat cfginfo.txt
命令执行结果截图:
二、基础的Shell脚本与编程
注:1. Shell脚本的创建可以通过vi来创建和编写的,要创建脚本文件需要将文件的后缀名改为.sh
2. 运行脚本文件需要先赋予可执行权限,在运行前需要运行 "chmod +x ./(文件名).sh " chmod为赋予权限 +x为赋予执行权限。
3. 运行脚本:$ ./(文件名).sh
4. 每个脚本文件都需要在第一行表明运行的Shell 一般都选用/bin/bash 代码为:#!/bin/bash
任务1:
编写一个脚本,用于打印当前工作目录中所有与文件相关的信息
要求:
运行脚本时,显示当前工作目录中的所有文件信息
展现当前正在工作目录中的文件,运用ls./ -l -h即可。
脚本代码:
运行结果:
任务2:
编写两个数字相加的脚本
要求:
请用户输入两个数字
用户还可以输入实数
使用bc命令和管道来完成
两数相加 我们首先要读入用户输入的两个变量并存储起来,再通过piping和bc实现数字相加,此处利用${num}来读取用户输入变量的具体的数值
脚本代码:
运行结果:
任务3:
编写脚本以逆序打印给定的数字
要求:
从用户处读取一个多位数的数字,并将其反转。
不仅仅是按相反的顺序打印
您必须提取每个数字并转换为反向。
当“0”作为最后一位时,请在倒车时丢弃。
通过if来判断最后一位是否为0,并根据判断结果调整读取的首个数的位置(最后一项为0直接不读), 之后利用for循环逆序打印即可.
脚本代码:
脚本运行结果:
任务4:
对于$PATH中的每个目录,显示该目录中的可执行文件数
要求:
从PATH变量获取每个目录。
使用-x选项if-if条件检查可执行权限。
逐个打印目录和可执行文件的数量。
最后打印可执行文件总数。
仅计数具有可执行权限的文件。
通过IFS改变系统的分词符,使其能够分割path中路径与路径之间的冒号。
通过for循环将每个path打印出来,同时对每一个path下的所有文件进行是否可执行的筛选计数,关键代码为:ls $path -F | grep “*” | wc -l ,并将每个path中的可执行文件数打印出来。
通过设置全局变量对总可执行文件数进行计数,最后将总的可执行文件数打印出来
最后别忘了重置IFS。
脚本代码:
脚本运行结果:
三、个人总结与心得
实验过程中,我个人认为对于初学者来说最难的还是四个shell脚本编程中的后三个。
先说说第二个shell脚本,有三个注意点:
1、read 可以读入用户输入
2、echo 想要识别转义字符"\c"(不换行),需要先写上"-e"来表示开启转义字符的识别。
3、想要调用参数的值(注意,是参数的值,比如系统输入的num1为10,需要用到10),在shell编程中是用美元符$加参数名来实现的。花括号可加可不加,不过为了方便看代码还是加上为好。
第三个shell脚本有两个注意点:
1、本题对shell编程语法熟练度要求高于前两题的之前所有的linux操作,需要熟悉对参数的调用,结构体的书写,以及对字符串、数组的操作熟练度。
2、在我自己写的过程中经常忘了给计算操作加上美元符$和双引号,同时我自己对shell中字符串的操作也很不熟悉,光是提取字符串的每一位这个操作我都想了很久,最后还是想到了用字符串的提取来进行操作.
eg. ${str:${pos}:1}
意为str字符串中第${pos}位(第一位为0)开始的第一个数(包括这一位)
第四个脚本困扰我的问题有两个。
一个是如何对 $PATH 那一大串连起来的进行划分。通过echo可以发现这些地址都通过 " :" 冒号连接,通过上网查找资料才知道shell自带分隔符IFS (默认为空格等),但这是可以进行修改的,所以经过对IFS再赋值,我还是成功的把每个地址都分别打印了出来。
第二是如何统计可执行文件的数量,通过上网我还是找到了答案,利用管道将ls grep wc这三个操作连在一起,也就是先将每一个path中的文件通过 " ls -l " 让文件一行一行列出来,再通过grep筛选并显示可执行文件的每一行( "*" 为可执行文件), " wc -l " 用于统计上个操作的行数,最后通过$()读取行数,并赋给参数输出即可。