现在的位置: 首页 > 综合 > 正文

shell学习6

2014年11月16日 ⁄ 综合 ⁄ 共 3878字 ⁄ 字号 评论关闭

 

把这几天的笔记记录如下:

1.赋值的一些办法

  1. variable1=`<file1`      #  将"file1"的内容放到"variable1"中.  
  2. variable2=`cat file2`   #  将"file2"的内容放到"variable2"中. 
  3. ############################################################ 
  4. var=`echo "one two three"` # 在这个方法中set --$var 后,有one=$1 
  5. set -- $var                # two=$2,three=$3,其中$1,$2,$3是位置参数 

2.重定向和文件描述符

  1. > filename #将会把文件"filename"变为一个空文件(就是size为0),如果  
  2.              #文件不存在,就创建一个长度为0的文件(同touch)。 
  3.  
  4. N<>filename  #为了读写"filename", 把文件"filename"打开, 并且将文件描 
  5.              #描述符N分配给它。如果filename不存在,就创建。如果N没有 
  6.              #指定,那默认就是fd 0,stdin 。 
  7.               
  8.                  示例 
  9. echo 1234567890 > File    # 写字符串到"File".  
  10. exec 3<> File             # 打开"File"并且将fd 3分配给它.  
  11. read -n 4 <&3             # 只读取4个字符.  
  12. echo -n . >&3             # 写一个小数点.  
  13. exec 3>&-                 # 关闭fd 3. 
  14. cat File                  # ==> 1234.67890 
  15.          关闭文件描述符 
  16. n<&-        # 关闭输入文件描述符n 
  17. 0<&-, <&-   # 关闭stdin 
  18. n>&-        # 关闭输出文件描述符n 
  19. 1>&-, >&-   # 关闭stdout 
  20.  
  21.          ####比较#### 
  22. ls -yz >> command.log 2>&1 # 将错误选项"yz"的结果放到 
  23.                            # 文件command.log中,因为 stderr                                  
  24.                            # 被重定向到这个文件中,所有的错误消息  
  25.                            # 也就被指向那里了(进入command.log)。  
  26.  
  27. ls -yz 2>&1 >> command.log # 输出一个错误消息, 但是并不写到文件中 
  28.  
  29. exec <filename # 将stdin重定向到文件中 
  30.  
  31.  
  32.                            

再给出一个脚本:

  1. /bin/bash 
  2. # 使用'exec'重定向stdin. 
  3.  
  4.  
  5. exec 6<&0          # 将文件描述符#6与stdin链接起来. 
  6.                    # 保存stdin. 
  7.  
  8. exec < data-file   # stdin被文件"data-file"所代替. 
  9.  
  10. read a1            # 读取文件"data-file"的第一行. 
  11. read a2            # 读取文件"data-file"的第二行. 
  12.  
  13. echo 
  14. echo "Following lines read from file." 
  15. echo "-------------------------------" 
  16. echo $a1 
  17. echo $a2 
  18.  
  19. echo; echo; echo 
  20.  
  21. exec 0<&6 6<&- 
  22. #  现在将stdin从fd #6中恢复, 因为刚才我们把stdin重定向到#6了, 
  23. #+ 然后关闭fd #6 ( 6<&- ), 好让这个描述符继续被其他进程所使用. 
  24. <&6 6<&-    这么做也可以. 
  25.  
  26. echo -n "Enter data  " 
  27. read b1  # 现在"read"已经恢复正常了, 就是能够正常的从stdin中读取. 
  28. echo "Input read from stdin." 
  29. echo "----------------------" 
  30. echo "b1 = $b1" 
  31.  
  32. echo 
  33. exit 0 
  34. [max@localhost xx]$ clear 
  35. [max@localhost xx]$ cat 2 
  36. /bin/bash 
  37. # 使用'exec'重定向stdin. 
  38.  
  39.  
  40. exec 6<&0          # 将文件描述符#6与stdin链接起来. 
  41.                    # 保存stdin. 
  42.  
  43. exec < data-file   # stdin被文件"data-file"所代替. 
  44.  
  45. read a1            # 读取文件"data-file"的第一行. 
  46. read a2            # 读取文件"data-file"的第二行. 
  47.  
  48. echo 
  49. echo "Following lines read from file." 
  50. echo "-------------------------------" 
  51. echo $a1 
  52. echo $a2 
  53.  
  54. echo; echo; echo 
  55.  
  56. exec 0<&6 6<&- 
  57. #  现在将stdin从fd #6中恢复, 因为刚才我们把stdin重定向到#6了, 
  58. #+ 然后关闭fd #6 ( 6<&- ), 好让这个描述符继续被其他进程所使用. 
  59. <&6 6<&-    这么做也可以. 
  60.  
  61. echo -n "Enter data  " 
  62. read b1  # 现在"read"已经恢复正常了, 就是能够正常的从stdin中读取. 
  63. echo "Input read from stdin." 
  64. echo "----------------------" 
  65. echo "b1 = $b1" 
  66.  
  67. echo 
  68. exit 0 
  69.  
  70.                            

3. shell中函数返回值最大的正整数是255.‘

4.调试shell的方法有下面这些

a): echo语句可以放在脚本中存在疑问的位置上, 来观察变量的值, 也可以了解脚本后续的动作;

b): 使用过滤器tee来检查临界点上的进程或数据流;

c):设置选项-n -v -x

 

      sh -n scriptname不会运行脚本, 只会检查脚本的语法错误. 这等价于把set -n或set -o noexec插入脚本中。注意, 某些类型的语法错误不会被这种方式检查出来。

      sh -v scriptname将会在运行脚本之前, 打印出每一个命令. 这等价于把set -v或set -o verbose插入到脚本中。

      选项-n和-v可以同时使用. sh -nv scriptname将会给出详细的语法检查。

      sh -x scriptname会打印出每个命令执行的结果, 但只使用缩写形式。 这等价于在脚本中插入set -x或set -o xtrace。

      把set -u或set -o nounset插入到脚本中, 并运行它, 就会在每个试图使用未声明变量的地方给出一个unbound variable错误信息. 

 

d):使用"assert"(断言)函数在脚本的临界点上测试变量或条件;

e):使用变量$LINENO和内建命令caller;

f):用trap捕获exit等信号,捕获exit在某些情况下很有用, 比如说强制"打印"变量值。trap命令必须放在脚本中第一个命令的位置上。

 

trap '' SIGNAL (两个引号之间为空)在剩余的脚本中禁用了SIGNAL信号的动作。trap SIGNAL则会恢复处理SIGNAL的动作。当你想保护脚本的临界部分不受意外的中断骚扰, 那么上面讲的这种办法就非常有用了。

如下:

  1. trap '' 2  # 信号2就是Control-C, 现在被禁用了.  
  2. command 
  3. command 
  4. command 
  5. trap 2     # 重新恢复Control-C 
  6.        

用trap捕获exit信号,来触发操作的脚本示例:

 

  1. #!/bin/bash 
  2.  
  3. trap 'echo Variable Listing -----a = $a b = $b' EXIT 
  4.  
  5. echo "This prints before the \"trap\" --" 
  6. echo "Even though the script sees the \"trap\" first." 
  7. echo 
  8.  
  9. a=39 
  10.  
  11. b=36 
  12.  
  13. exit 0 

输出一下结果:

  1. This prints before the "trap" -- 
  2. Even though the script sees the "trap" first. 
  3.  
  4. Variable Listing -----a = 39 b = 36 

5。shell选项,shell有很多选项,如下图所示:

 

     好了,这是这几天的笔记、、、、、

【上篇】
【下篇】

抱歉!评论已关闭.