Chinaunix首页 | 论坛 | 博客
  • 博客访问: 229990
  • 博文数量: 14
  • 博客积分: 167
  • 博客等级: 入伍新兵
  • 技术积分: 274
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-29 13:28
文章分类

全部博文(14)

文章存档

2014年(5)

2013年(4)

2012年(5)

我的朋友

分类: LINUX

2013-07-30 15:08:40

在Linux bash编程中,常会用到for循环。根据介绍,for循环有两种语法:

  1. 第一种:
  2. for name [[in [words …]];] do commands; done

  3. 第二种:
  4. for ((expr1; expr2; expr3)); do commands; done
这两种语法,网上的介绍还是比较多的,这里不多介绍。

今日在看nginx的代码的时候,发现另一种写法(第一种的简略吧),我是第一次看到,所以记录一下。
起因是我想看一下configure文件的配置项,但我没有./configure --help,而是直接看configure文件,起始nginx的configure分成了许多个脚本,选项部分在auto/options文件中。

部分代码如下:
  1. # Copyright (C) Igor Sysoev
  2. # Copyright (C) Nginx, Inc.

  3. ...

  4. opt=

  5. for option
  6. do
  7.     opt="$opt `echo $option | sed -e \"s/\(--[^=]*=\)\(.* .*\)/\1'\2'/\"`"

  8.     case "$option" in
  9.         -*=*) value=`echo "$option" | sed -e 's/[-_a-zA-Z0-9]*=//'` ;;
  10.            *) value="" ;;
  11.     esac

  12.     case "$option" in
  13.         --help) help=yes ;;

  14. ...

  15.         *)
  16.             echo "$0: error: invalid option \"$option\""
  17.             exit 1
  18.         ;;
  19.     esac
  20. done


  21. NGX_CONFIGURE="$opt"
我的第一感觉,是这个for循环挺奇怪的,以为option是从哪里传入的,实际上并不是,做试验:

  1. [ZhShiH@localhost tmp]$ cat for_test.sh
  2. #!/bin/bash

  3. echo '$#: '$#
  4. echo '$@: '$@
  5. echo '$*: '$*

  6. # test option
  7. echo ""
  8. for option
  9. do
  10.     echo $option
  11. done

  12. # test $@
  13. echo ""
  14. for i in $@
  15. do
  16.     echo $i
  17. done

  18. # test $*
  19. echo ""
  20. for i in $*
  21. do
  22.     echo $i
  23. done

  24. # test "$@"
  25. echo ""
  26. for i in "$@"
  27. do
  28.     echo $i
  29. done

  30. # test "$*"
  31. echo ""
  32. for i in "$*"
  33. do
  34.     echo $i
  35. done
输出的结果是:

  1. [ZhShiH@localhost tmp]$ ./for_test.sh 1 2 3
  2. $#: 3
  3. $@: 1 2 3
  4. $*: 1 2 3

  5. 1
  6. 2
  7. 3

  8. 1
  9. 2
  10. 3

  11. 1
  12. 2
  13. 3

  14. 1
  15. 2
  16. 3

  17. 1 2 3
从结果看来,for option; do command; done 与 for option in $@; do command; done 效果是一样的,其实是读取了脚本的参数,来做操作。
for循环这样的写法,有点意思啊。

顺便提一下$#,$*,$@:

$#:是脚本参数的个数。
$*:所有的位置参数,所有参数被作为一整个单词,"$*"应使用""引用为宜。
$@:所有的位置参数,每个参数被作为单独一个单词,"$*"应使用""引用为宜。
阅读(2169) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~