Linux教程(第4版)习题答案第1-6章(2)第3,4章

    技术2026-08-04  19

    关注公众号凡花花的小窝,收获更多的考研计算机专业编程相关的资料 思考题3 3.1 进入和退出vi的方法有哪些? 答:进入vi的方法:在系统提示符(设为$ )下输入命令vi和想要编辑(建立)的文件名,便可进入vi,如:$ vi filename 退出vi的方法: (1) :wq 把编辑缓冲区的内容写到你编辑的文件中,退出编辑器,回到 shell下。 (其操作过程是,先输入冒号“: ”,再输入命令wq。以下命令操作相同。) (2) :ZZ(大写字母ZZ) 仅当做过修改时才将缓冲区内容写到文件上。 (3) :x 与:ZZ相同。 (4) :q! 强行退出vi。感叹号(!)告诉vi,无条件退出,丢弃缓冲区内容。 3.2 vi编辑器的工作方式有哪些?相互间如何转换? 答:vi编辑器有三种工作方式: 命令方式、插入方式和ex转义方式。 ●Shell命令→vi的命令方式:输入命令vi进入编辑器时,就处于vi的命令方式。 ●vi的命令方式→Shell命令:在vi的命令方式下使用退出命令,可以返回shell命令方式。 ●vi命令方式→插入方式:通过输入vi的插入命令(i)、附加命令(a)、打开命令(o)、替换命令(s)、修改命令©或取代命令®可以从命令方式进入到插入方式。 ●插入方式→vi命令方式:由插入方式回到命令方式的办法是按Esc键(通常在键盘的左上角)。 ●vi的命令方式→Ex转义方式:在vi的命令方式下,输入一个冒号(:),就进入Ex转义方式。 ●Ex转义方式→vi的命令方式:转义命令执行后,自动回到vi命令方式。 3.3 建立一个文本文件,如会议通知。 (1)建立文件notes,并统计其大小。 (2)重新编辑文件notes,加上一个适当的标题。 (3)修改notes中开会的时间和地点。 (4)删除文件中第3行,然后予以恢复。 答:上机题。体会vi编辑器的工作方式及相互转换,熟悉基本命令的使用。可参照以下步骤做: (1)进入vi ,建立一个空文件notes; (2)进入插入方式,编辑一个会议通知; (3)返回vi命令方式,保存编辑的内容并退出vi; (4)在shell命令方式下,执行wc命令,统计文件notes的大小; (5)利用vi,重新编辑文件notes,加上一个会议通知的标题; (6)保存编辑内容并退出vi,利用cat命令查看该文件的内容; (7)重新编辑文件notes,修改其中开会的时间和地点; (8)保存内容并退出vi,然后利用cat命令查看该文件的内容,注意内容的变化; (9)重新编辑该文件,利用文本删除命令删除其中的第3行;接着分别利用复原命令u和U恢复删除的内容。注意各个命令执行后屏幕显示内容的变化。从中体会各命令的功能。

    3.4 建立一个文本文件,将光标移至第5行上。分别利用c,C和cc命令进行修改。 答:上机题。体会在vi编辑方式下,光标移动的方式和不同修改命令的功能。注意各命令的使用方式和光标位置的移动。 3.5 在vi之下,上、下、左、右移动光标的方式有哪些? 答:参照本教材P79的图3.2解答。 3.6 解释下述vi命令的功能: 20G 18 | dM 6H d4B x cw 10cc 3rk 5s 7S >8M /this ?abc?-5 mg g/int/p 答:20G 光标移至第20行的开头。 18 | 光标移至当前行的第18列上。 dM 删除从当前行至屏幕中间行的所有行 6H 将光标移到距离屏幕顶部5行的行首 d4B 从光标位置反向删除4个词(包括光标所在词)。 x 删除光标所在的字符。 cw 将光标所在字符至词尾删除,然后用新输入的文本代替。 10cc 先删除光标所在行及其下面9行(共10行),然后以新输入的文本代替。 3rk 表示从光标位置开始向右共有3个字符被k替代。 5s 光标所在字符及其后的4个字符(共5个字符)被新输入的字符序列替代。 7S 当前行及其下面6行(共7行)被新输入的正文替换。

    8M 将当前行和屏幕中间行之间各行向右移动8个字符 /this 从光标所在行开始向前查找字符串“this”,找到后就做上标记。 ?abc?-5 从光标所在行开始向后查找字符串“abc”,光标停在首次找到行之前的倒数第5行的行首,即行号是(匹配行号-5)。 mg 在光标所在位置做上标记g,但屏幕上并不显示 “ g ”。 g/int/p 在屏幕上显示当前所编辑的文件中所有包含字符串“int”的行。 3.7 如果希望进入vi后光标位于文件的第10行上,应输入什么命令? 答:设要编辑的文件名是abc,且该文件大于10行。在shell提示符后输入以下命令: vi +10 abc 3.8 不管文件中某一行被编辑了多少次,总能把它恢复成被编辑之前的样子,应使用什么命令? 答:使用U(大写字母)命令就能把当前行恢复成被编辑之前的样子。 3.9 要将编辑文件中所有的字符串s1全部用字符串s2替换,包括在一行中多次出现的字符串,应使用什么命令格式? 答:可以使用的命令格式是:g/s1/s//s2/g

    思考题4 4.1 常用的shell有哪几种?Linux系统中默认的shell是什么? 答:常用的有: Bourne shell(简称sh)、C shell(简称csh)、Korn shell(简称ksh)和Bourne Again shell(简称bash)。 Linux系统中默认的shell是bash。 4.2 简述shell的主要功能。bash有什么特点? 答:shell具有如下主要功能: (1)命令组合,构成新的命令; (2)提供了文件名扩展字符(通配符,如* 、 ?、 [ ]); (3) 可以直接使用shell的内置命令,而不需创建新的进程; (4)允许灵活地使用数据流,提供通配符、输入/输出重定向、管道线等机制,方便了模式匹配、I/O处理和数据传输; (5) 结构化的程序模块,提供了顺序流程控制、条件控制、循环控制等; (6)提供了在后台(&)执行命令的能力; (7)提供了可配置的环境,允许创建和修改命令、命令提示符和其他的系统行为; (8)提供了一个高级的命令语言,能创建从简单到复杂的程序。这些shell程序称为shell脚本。 bash是Linux系统默认的一个shell。bash不但与Bourne shell兼容,还继承了C shell,Korn shell等下述优点: ① 命令行历史。使用命令行历史特性,可以恢复以前输入的命令。 ② 命令行编辑。可以利用编辑器(如vi)修改已经输入的命令。 ③ 命令补全。能在输入文件名的一部分之后,由系统自动填入剩余的部分。 ④ 别名扩展。能建立代表某些命令的名字。 4.3 执行shell脚本的方式主要是哪些? 答:执行shell脚本的常用方式基本上有两种: (1) 以脚本名作为参数。其一般形式是: $ bash 脚本名 [参数] (2) 将shell脚本的权限设置为可执行,然后在提示符下直接执行它。 例如,设abcd是shell脚本文件,执行步骤如下: $ chmod a+x abcd $ PATH=$PATH:· $ abcd 或者 $ · /abcd 4.4 将主提示符改为用户的主目录名,并予以输出。 答:$ PS1=”$HOME> ” echo $PS1 $ export PS1 4.5 说明三种引号的作用有什么区别。 答:在shell中引号分为三种: 双引号、单引号和倒引号。 (1)由双引号括起来的字符(除$、倒引号ˋ 和转义字符\外)均作为普通字符对待,而那三个字符仍保留其特殊功能。 (2)由单引号括起来的所有字符都作为普通字符出现。 (3)用倒引号括起来的字符串被shell解释为命令行,在执行时,shell会先执行该命令行,并以执行结果取代用倒引号括起的部分。另外,可以将一个命令的执行结果赋给变量,即命令替换。 4.6 利用变量赋值方式,将字符串DOS file c : > $student*显示出来。 答:$ string=’ DOS file c:>\$student\*’ $ echo s t r i n g 4.7 显 示 环 境 变 量 的 设 置 情 况 , 说 明 各 自 的 意 义 。 答 : 执 行 e n v 命 令 , 在 屏 幕 上 将 会 显 示 出 当 前 环 境 下 的 所 有 环 境 变 量 及 其 值 。 读 者 可 以 依 据 所 用 机 器 上 实 际 显 示 的 信 息 , 进 行 说 明 。 常 用 的 环 境 变 量 有 以 下 几 个 。 ( 1 ) H O M E : 用 户 主 目 录 的 全 路 径 名 。 ( 2 ) L O G N A M E : 即 用 户 注 册 名 , 由 L i n u x 自 动 设 置 。 ( 3 ) P W D : 当 前 工 作 目 录 的 路 径 。 ( 4 ) P A T H : s h e l l 查 找 命 令 的 路 径 ( 目 录 ) 列 表 , 各 个 目 录 用 冒 号 ( : ) 隔 开 。 ( 5 ) P S 1 : s h e l l 的 主 提 示 符 。 用 户 可 以 设 置 P S 1 的 值 。 ⑹ S H E L L : 当 前 使 用 的 s h e l l 。 通 常 , 它 的 值 是 / b i n / b a s h 。 ⑺ T E R M : 终 端 类 型 。 ( 8 ) M A I L : 系 统 信 箱 的 路 径 。 4.8 分 析 下 列 s h e l l 脚 本 的 功 能 : c o u n t = string 4.7 显示环境变量的设置情况,说明各自的意义。 答:执行env命令,在屏幕上将会显示出当前环境下的所有环境变量及其值。读者可以依据所用机器上实际显示的信息,进行说明。常用的环境变量有以下几个。 (1) HOME: 用户主目录的全路径名。 (2) LOGNAME: 即用户注册名,由Linux自动设置。 (3) PWD: 当前工作目录的路径。 (4) PATH: shell查找命令的路径(目录)列表,各个目录用冒号(: )隔开。 (5) PS1: shell的主提示符。用户可以设置PS1的值。 ⑹ SHELL: 当前使用的shell。通常,它的值是/bin/bash。 ⑺TERM: 终端类型。 (8) MAIL: 系统信箱的路径。 4.8 分析下列shell脚本的功能: count= string4.7env(1)HOME(2)LOGNAMELinux(3)PWD(4)PATHshell(5)PS1shellPS1SHELL使shell/bin/bashTERM(8)MAIL4.8shellcount=# cmd=echo while[ c o u n t – g t 0 ] d o c m d = ” count –gt 0 ] do cmd=” countgt0]docmd=cmd $$count” ((count=count-1)) done eval $cmd

    答:该脚本的功能是:逆向输出用户在命令行上提供的各个参数。例如,设该脚本名是ABC,执行该脚本的命令行是:$ ABC apple big cat dog 则结果输出是:dog cat big apple 4.9 编写一个shell脚本,它把第二个位置参数及其以后的各个参数指定的文件复制到第一个位置参数指定的目录中。 答:上机实践题。参考脚本如下: #!/bin/bash

    count=$# if [ -d “$1” ] then n=2 dir=$1 while [ $n –le $count ] do if [ -f $2 ] then cp $2 $dir else echo “$2 is not an ordinary file.” fi shift ((n=n+1)) done else echo “$1 is not a directory.” fi

    4.10 编写一个shell脚本,显示当天日期,查找给定的某用户是否在系统中工作。如果在系统中,就发一个问候给他。 答:上机实践题。参考脚本如下: #!/bin/bash

    date echo “Input a user name for searching” read name if who|grep “$name” then echo “Lucky, there is $name in my system now.” echo “Hi,how are you!” > /var/spool/mail/$name else echo “Unlucky, there is not $name in my system.” fi

    4.11 打印给定目录下的某些文件,由第一个参数指出文件所在的目录,其余参数是要打印的文件名。 答:上机实践题。参考脚本如下: #!/bin/bash

    count=$#

    if [ -d “$1” ] then cd $1 n=2 while[ $n –le $count ] do if [ -f $2 ] then cat $2 else echo “Sorry, cannot display $2.” fi shift ((n=n+1)) done else echo “$1 is not a directory.” fi

    4.12 利用for循环将当前目录下的 .c文件移到指定的目录下,并按文件大小排序,显示移动后指定目录的内容。 答:上机实践题。参考脚本如下: #!/bin/bash

    echo “Input the name of a directory.” read dir

    if [ -d $dir ] then for name in *.c do mv n a m e d i r d o n e l s − S d i r l s d i r e l s e e c h o “ S o r r y ! name dir done ls -S dir ls dir else echo “Sorry! namedirdonelsSdirlsdirelseechoSorry!dir is not a directory.” fi

    4.13 利用数组形式存放10个城市的名字,然后利用for循环把它们打印出来。 答:上机实践题。参考脚本如下: #!/bin/bash city=( Beijing Shanghai Tianjin Guangzhou Chongqing Hangzhou Nanjing Shenyang Taiyuan Jinan) for i in ${city[*]} do echo $i done

    4.14 编写一个shell脚本,求费波纳奇数列的前10项及总和。 答:上机实践题。参考脚本如下: #!/bin/bash

    fib[1]=1

    fib[2]=1 n=3 ((sum= fib[1]+fib[2])) while [ $n –lt 10 ] do ((fib[n]=fib[n-1]+fib[n-2])) ((fib[n+1]=fib[n-1]+fib[n])) ((sum=sum+fib[n]+fib[n+1])) ((n=n+2)) done for ((i=1;i<=10;i++)) do echo ${fib[i]} done echo $sum

    4.15 下述表达式的作用是什么? ${ name[] } ${ name[@] } ${ name #/ } ${ name %%.* } ${ #name[] } n a m e : − H e l l o 答 : { name:-Hello } 答: name:Hello{name[]}和${name[@]} 都表示数组name中所有非空元素的值,每个元素的值用空格分开。 ${ name #/ } 如果name值的开头包含模式/,那么该表达式的值就是name中去掉最少匹配*/部分后的结果;否则,就是name的值。 ${ name %%.* } 如果name值的末尾包含.*,那么该表达式的值就是name中去掉最多匹配.部分后的结果;否则,就是name的值。 ${#nane[]}的值是数组name中已经设置的元素的个数。 ${ name:-Hello } 如果name的值为空,则整个表达式的值等于给定的字符串Hello,name保持不变;否则,整个表达式的值等于name的值,name保持不变。 4.16 显示前面所执行的40个命令的清单,重新执行倒数第5条命令。编辑其中一条命令,然后执行。 答:上机实践题。 $ history 40 $ !-5 然后,按↑键或↓键,找到你要编辑的命令; 进行编辑; 按Enter键,执行该命令。

    4.17 定义一个别名命令,它等价的功能是:显示当前日期及工作目录,并列出有多少用户在系统上工作。 答:上机实践题。 $ alias cmd=’date;pwd;who|wc –l’ $ cmd 4.18 设计一个程序cuts,它由标准输入读取数据,获取由第一个参数n和第二个参数m所限定范围的数据,n和m都是整数,即从输入的字符串中抽取第n个字符至第m个字符之间的所有字符(包括这两个字符)。例如: $ cuts 11 14 this is a test of cuts program (输入) test (显示结果) 答:上机实践题。参考脚本如下:

    #!/bin/bash read -p "Input a string: " str echo $str | cut -c $1-$2

    Processed: 0.064, SQL: 9