《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中执行命令实现对该列表的排序,并采用两列来显示"

《Linux命令、编辑器与Shell编程》部分高级练习解题思路
 上面是执行命令前


《Linux命令、编辑器与Shell编程》部分高级练习解题思路
 上面是执行完"% !sort"后的效果,其中"%"代表整个工作缓冲区

"15. 使用哪些命令可以将所有行中的 hither 与 yon 单词交换,其中,两个单词间的字数不确定。"

解题思路:此题考虑使用正则表达式。

 
《Linux命令、编辑器与Shell编程》部分高级练习解题思路
 上面是执行替换命令前

 
《Linux命令、编辑器与Shell编程》部分高级练习解题思路
 这是执行替换命令后

替换命令为: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]

 
《Linux命令、编辑器与Shell编程》部分高级练习解题思路
 这是我在命令行执行 PS1="[\$?] 之前


《Linux命令、编辑器与Shell编程》部分高级练习解题思路
 这是我执行 PS1="[\$?] 之后

《Linux命令、编辑器与Shell编程》部分高级练习解题思路
 执行 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

 测试如下图所示


《Linux命令、编辑器与Shell编程》部分高级练习解题思路
 

结束语:以上只是一部分习题的解题思路,如读者在其他习题上遇到问题,可以一起探讨。由于本人水平所限,如有错误,还请指正。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关推荐