《Linux命令、编辑器与Shell编程》部分高级练习解题思路
前言:
《Linux命令、编辑器与Shell编程》这本书可以说是我的Linux启蒙教材。最初在看这本书的时候,对每一章后面的高级练习都感到头疼,甚至束手无策。最近重新翻阅这本书,顺便也把部分高级练习的解题思路写在这里。
第四章 linux文件系统 课后练习
"13. 如何才能创建一个名为-i 的文件? 采用哪种方法不能奏效? 为什么不能? 如何删除该文件?"
解题思路:我们知道,在linux系统下,只要文件名不包含(/)和空操作符(null)都是合法的文件名。斜线用来分隔构成路径名的各文件名,空操作符则用来终止一个路径名。(注意:别把空操作符(null)和空格(SPACE),制表符(TAB),回车(CR)这些空字符搞混淆)。
(以下直接在命令行输入)
方法1:touch ./-i
方法2:echo "Hello, World!" > -i
方法3:在vim中命令模式键入"w \-i"
删除文件命令:rm ./-i
"14. 假设工作目录下仅包含一个名为andor的文件那么执行命令"mv andor and\/or"会得要什么错误信息?在什么情况下,运行该命令不会报错?"
解题思路:命令会提示没有and/or那个文件或者目录。因为文件名中是不能包含斜杠(/)就算用反斜杠(\)转义也没用。该命令会被Shell理解为”把andor文件移动到当前工作目录目录and目录下的or目录中“,只要存在这么目录树就不会报错了。
"15. 通过命令 ls -i 可在文件名前面显示文件对应 inode 的编号。输入一个命令将工作目录下的所有文件 inode 和文件名输出到某个文件中,并按照inode编号排序(提示:使用管道)"
解题思路:ls -i | sort -n > file
第五章 Shell 课后练习
"12. 假设用户对某个文件具有写权限但不能删除它, 那么:"
a. 在不调用编辑器的情况下,给出将该文件变为空的命令。
解题思路:cat /dev/null > filename
b. 说明在什么情况下,用户可以对某个文件具有修改权限而没有删除权限。
用户对该文件只具有写(w)权限,而不具有读(r)权限
"15. 为什么命令名和文件名中通常都不包括空格?如何创建一个包含空格的文件名?又如何删除它?"
解题思路:因为 Shell 默认内部字段分隔符(IFS)为空格(SPACE),制表符(TAB),回车(CR)。
(IFS=' \t\n')。创建命令:touch 'Hello World' 或者 touch Hello\ World 只需要把空格转义就行。同理删除命令:rm 'Hello World' 或者 rm Hello\ World
第六章 vim 编辑器 课后练习
"12. 创建一个包含以下列表的文件,然后在vim中执行命令实现对该列表的排序,并采用两列来显示"
上面是执行命令前
上面是执行完"% !sort"后的效果,其中"%"代表整个工作缓冲区
"15. 使用哪些命令可以将所有行中的 hither 与 yon 单词交换,其中,两个单词间的字数不确定。"
解题思路:此题考虑使用正则表达式。
上面是执行替换命令前
这是执行替换命令后
替换命令为:g/\(\<yon\>\)\(.*\)\(\<hither\>\)/s//\3\2\1/
其中"\<yon\>"匹配单词"yon","\<hither\>"匹配单词"hither",".*"匹配两个单词之间的任意字符。用一对圆括号()将这三个表达式括起来进行模块匹配。(注:在这里面使用圆括号需要用反斜杠(\)将其转义。)然后在替换模式中用\1来调用第一个识别的模块,\2调用第二个识别的模块,\3调用第三个识别的模块。
第八章 Bourne Again Shell 课后练习
"12. 将前一条命令的退出状态添加到提示符中,使其表现得如下所示:"
$ [0] ls xxx
ls: xxx: No sush file or directory
$ [1]
这是我在命令行执行 PS1="[\$?] 之前
这是我执行 PS1="[\$?] 之后
执行 PS1="[\u@\h \W]$ " 恢复默认
"13. dirname 工具将它的参数作为一个路径名,并将该路径前缀(不包含最后部分的整个串)写到标准输出:
$ dirname a/b/c/d
a/b/c
如果只给 dirname 一个简单的文件名(不包含字符/)作为参数,dirname 将写一个 . 字符到标准输出:
$ dirname simple
.
用一个bash函数实现 dirname 。要确保当参数为/之类的时,该函数也能正确处理"
#!/bin/bash # my_dirname - this is a local command of dirname IFS.OLD=$IFS #备份IFS IFS=$'/' #把路径分隔符'/'设为IFS if [ $# -ne 1 ] then echo "Usage: my_dirname.sh /home/wx" else length=0 for var in $* do param[$length]=$var #把路径名分别存储在数组param中 length=$[ $length + 1 ] #数组的长度,或者直接这样也行${#param[*]} done if [ $length -eq 1 ] #处理简单文件名(不包含/) then echo '.' else count=1 if [ -z ${param[0]} ] #处理 /a/b/c/d 绝对路径这种情况 then length=$[$length - 1] while [ $count -lt $length ] do echo -n "/${param[$count]}" count=$[ $count + 1 ] done else #处理 a/b/c/d 相对路径这种情况 echo -n "${param[0]}" length=$[$length - 1] while [ $count -lt $length ] do echo -n "/${param[$count]}" count=$[ $count + 1 ] done fi echo fi fi IFS=$IFS.OLD #恢复IFS exit 0
测试如下图所示
结束语:以上只是一部分习题的解题思路,如读者在其他习题上遇到问题,可以一起探讨。由于本人水平所限,如有错误,还请指正。
版权声明:本文为博主原创文章,未经博主允许不得转载。