Chinaunix首页 | 论坛 | 博客
  • 博客访问: 44979
  • 博文数量: 11
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 204
  • 用 户 组: 普通用户
  • 注册时间: 2013-12-20 09:10
文章分类
文章存档

2014年(7)

2013年(4)

我的朋友

分类: LINUX

2014-01-04 22:43:23


  1. 关于echo的用法主要是两个参数的理解
    1. $ echo -n "aloha,everyone!"
    2. aloha,everyone $
    3. 参数-n表示输出之后不换行,默认情况下会有换行符
    1. $ echo -e "Status\tIP_address\tTimes "
    2. $ Status    IP_address    Times
    3. 参数-e表示启用输出中的反斜杠转义符,默认是关闭的

     2
. 脚本在
fork/source/exec三种模式下运行的差异
  • 默认情况下,脚本是以fork的方式运行的,即在执行一个shell脚本时,是由当前shell(父进程)生成一个子进程来执行这个脚本的,然后这个sub-process再产生执行命令行的子进程。当执行完成后,sub-process结束并返回到父进程,此时子进程的变化不会影响到父进程。

  • 点击(此处)折叠或打开

    1. #!/bin/bash

    2.   cd /home/work/software

    3. #执行这个脚本时,并不会跳转到software目录下;
    4. #虽然子进程会跳转到software,但父进程不会随着子进程改变而变化

  • 如果要是上例能够在执行脚本之后完成跳转,则需要另一种运行方式:source. 即
    1. source script.sh
    2. . ./script.sh   #两种情况相同
    此时运行脚本时,会在当前shell(即当前进程)下运行,而不是产生一个sub-process来执行脚本。

  • 第三种是exec 这种方式同样也在当前shell下运行脚本,但是原来的进程(所谓的父进程)会被终止

    点击(此处)折叠或打开

    1. #!/bin/bash
    2. #1.sh

    3.         A=B

    4.         echo "The PID of 1.sh before exec/fork/source is: $$"
    5.         export A

    6.         case $1 in

    7.                 exec)
    8.                         echo "After exec..."
    9.                                 exec ./2.sh;;
    10.                 fork)
    11.                         echo "After fork..."
    12.                                 ./2.sh;;
    13.                 source)
    14.                         echo "After source..."
    15.                                 . ./2.sh;;
    16.         esac

    17.         echo "The PID of 1.sh after exec/fork/source is:$$"
    18.         echo "1.sh: \$A is $A"
    2.sh
    1. #!/bin/bash
    2. #2.sh
    3.     echo "PID for 2.sh: $$"
    4.     echo "2.sh get \$A=$A from 1.sh"
    5.     A=C
    6.     export A
    7.     echo "2.sh: \$A is $A"


此时,分别执行三种模式后的结果为:
    1. [Carl@localhost software]$ ./1.sh fork
    2. The PID of 1.sh before exec/fork/source is: 4589
    3. After fork...
    4. PID for 2.sh: 4590
    5. 2.sh get $A=B from 1.sh
    6. 2.sh: $A is C
    7. The PID of 1.sh after exec/fork/source is:4589
    8. 1.sh: $A is B
    9. [Carl@localhost software]$
    fork下,会产生一个子进程(PID4590)来执行2.sh这个脚本,同时子进程中A都值变成了C,但没有影响父进程中A最终的结果。变量只能从父进程中继承,而无法由子进程传给父进程。

    1. [Carl@localhost software]$ ./1.sh source
    2. The PID of 1.sh before exec/fork/source is: 4682
    3. After source...
    4. PID for 2.sh: 4682
    5. 2.sh get $A=B from 1.sh
    6. 2.sh: $A is C
    7. The PID of 1.sh after exec/fork/source is:4682
    8. 1.sh: $A is C
    9. [Carl@localhost software]$
    source方式,2.sh与1.sh处于同一个shell中(PID 均为4682),因此A的值首先被赋为B,然后赋值为C

    1. [Carl@localhost software]$ ./1.sh exec
    2. The PID of 1.sh before exec/fork/source is: 4726
    3. After exec...
    4. PID for 2.sh: 4726
    5. 2.sh get $A=B from 1.sh
    6. 2.sh: $A is C
    7. [Carl@localhost software]$
    这是exec方式,类似于source,2.sh也是在1.sh的shell中执行的,但2.sh执行完之后直接结束了


    3. 重新认识单引号引号反斜杠
        awk的用法一般是
  1. awk '{print $1}' file
        这是因为需要单引号解除一些特殊字符的含义,依次为{,空格,$和},这就将print $1视为一个命令块来执行。如果不适用单引号,则会报awk语法错误。
        
        理解单引号在这里的含义之后,我们同样可以将awk的写法变出点花样(有点stupid,但是便于理解原理)

  1. A=1
  2. awk '{print $'$A'}' file #第一种
  3. awk \{print\ \$$A \} file #第二种
  4. awk '{print $'"$A" '}' file #第三种
这几种方式的效果和上面的完全一样(验证通过)

点击(此处)折叠或打开

  1. [Carl@localhost ~]$ A=1
  2. [Carl@localhost ~]$ awk \{print\ \$$A\} access.log |head -n 5
  3. 42.156.139.69
  4. 42.156.138.113
  5. 203.208.60.112
  6. 61.135.190.201
  7. 42.156.137.113
  8. [Carl@localhost ~]$



  1. [Carl@localhost ~]$ awk '{print $'$A'}' access.log |head -n 5
  2. 42.156.139.69
  3. 42.156.138.113
  4. 203.208.60.112
  5. 61.135.190.201
  6. 42.156.137.113
  7. [Carl@localhost ~]$
一定要留意其中的空格,需要将其转意(用反斜杠或者包在单引号内),否则会报语法错




阅读(725) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~