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


前言:

《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编程》部分高级练习解题思路                                linuxshell脚本 
 上面是执行命令前

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

 

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

 

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

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

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

替换命令为: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编程》部分高级练习解题思路                                linuxshell脚本&nbsp;
 这是我在命令行执行 PS1=”[/$?] 之前

《Linux命令、编辑器与Shell编程》部分高级练习解题思路                                linuxshell脚本&nbsp;
 这是我执行 PS1=”[/$?] 之后

 

《Linux命令、编辑器与Shell编程》部分高级练习解题思路                                linuxshell脚本&nbsp;
 执行 PS1=”[/u@/h /W]$ “ 恢复默认

 

“13. dirname 工具将它的参数作为一个路径名,并将该路径前缀(不包含最后部分的整个串)写到标准输出:

$ dirname a/b/c/d

a/b/c

如果只给 dirname 一个简单的文件名(不包含字符/)作为参数,dirname 将写一个 . 字符到标准输出:

$ dirname simple

.

用一个bash函数实现 dirname 。要确保当参数为/之类的时,该函数也能正确处理”

      1 #!/bin/bash       2        3 # my_dirname -  this is a local command of dirname       4        5 IFS.OLD=$IFS    #备份IFS       6 IFS=$'/'             #把路径分隔符'/'设为IFS       7 if [ $# -ne 1 ]       8 then       9     echo "Usage: my_dirname.sh /home/wx"      10 else      11     length=0      12     for var in $*      13     do      14         param[$length]=$var          #把路径名分别存储在数组param中      15         length=$[ $length + 1 ]      #数组的长度,或者直接这样也行${#param[*]}      16     done      17       18     if [ $length -eq 1 ]   #处理简单文件名(不包含/)      19     then      20         echo '.'      21     else      22         count=1      23         if [ -z ${param[0]} ]      #处理 /a/b/c/d 绝对路径这种情况      24         then      25             length=$[$length - 1]      26             while [ $count -lt $length ]      27             do      28                 echo -n "/${param[$count]}"      29                 count=$[ $count + 1 ]      30             done      31         else                                #处理 a/b/c/d 相对路径这种情况      32             echo -n "${param[0]}"      33             length=$[$length - 1]      34             while [ $count -lt $length ]      35             do      36                 echo -n "/${param[$count]}"      37                 count=$[ $count + 1 ]      38             done      39         fi      40         echo      41     fi      42 fi      43 IFS=$IFS.OLD   #恢复IFS      44 exit 0

 测试如下图所示

《Linux命令、编辑器与Shell编程》部分高级练习解题思路                                linuxshell脚本&nbsp;
 

 

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

 

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


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


前言:

《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编程》部分高级练习解题思路                                linuxshell脚本&nbsp;
 上面是执行命令前

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

 

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

 

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

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

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

替换命令为: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编程》部分高级练习解题思路                                linuxshell脚本&nbsp;
 这是我在命令行执行 PS1=”[/$?] 之前

《Linux命令、编辑器与Shell编程》部分高级练习解题思路                                linuxshell脚本&nbsp;
 这是我执行 PS1=”[/$?] 之后

 

《Linux命令、编辑器与Shell编程》部分高级练习解题思路                                linuxshell脚本&nbsp;
 执行 PS1=”[/u@/h /W]$ “ 恢复默认

 

“13. dirname 工具将它的参数作为一个路径名,并将该路径前缀(不包含最后部分的整个串)写到标准输出:

$ dirname a/b/c/d

a/b/c

如果只给 dirname 一个简单的文件名(不包含字符/)作为参数,dirname 将写一个 . 字符到标准输出:

$ dirname simple

.

用一个bash函数实现 dirname 。要确保当参数为/之类的时,该函数也能正确处理”

      1 #!/bin/bash       2        3 # my_dirname -  this is a local command of dirname       4        5 IFS.OLD=$IFS    #备份IFS       6 IFS=$'/'             #把路径分隔符'/'设为IFS       7 if [ $# -ne 1 ]       8 then       9     echo "Usage: my_dirname.sh /home/wx"      10 else      11     length=0      12     for var in $*      13     do      14         param[$length]=$var          #把路径名分别存储在数组param中      15         length=$[ $length + 1 ]      #数组的长度,或者直接这样也行${#param[*]}      16     done      17       18     if [ $length -eq 1 ]   #处理简单文件名(不包含/)      19     then      20         echo '.'      21     else      22         count=1      23         if [ -z ${param[0]} ]      #处理 /a/b/c/d 绝对路径这种情况      24         then      25             length=$[$length - 1]      26             while [ $count -lt $length ]      27             do      28                 echo -n "/${param[$count]}"      29                 count=$[ $count + 1 ]      30             done      31         else                                #处理 a/b/c/d 相对路径这种情况      32             echo -n "${param[0]}"      33             length=$[$length - 1]      34             while [ $count -lt $length ]      35             do      36                 echo -n "/${param[$count]}"      37                 count=$[ $count + 1 ]      38             done      39         fi      40         echo      41     fi      42 fi      43 IFS=$IFS.OLD   #恢复IFS      44 exit 0

 测试如下图所示

《Linux命令、编辑器与Shell编程》部分高级练习解题思路                                linuxshell脚本&nbsp;
 

 

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

 

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