LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1067|回复: 8

兄弟们,帮忙解释一下,看不懂这个代码?及$@和$*的区别?

[复制链接]
发表于 2005-4-27 22:15:10 | 显示全部楼层 |阅读模式

  1. #!/bin/sh
  2. while [ "$1" ]
  3. do
  4.       if [ "$1" = "-i" ]
  5.          then
  6.               infile=" $2 "#我不懂这里赋值时,为什么要加双引号,而不是infile= $2,什么情况下
  7.               shift 2         #赋值时候才加双引号,兄弟们能告诉我吗?
  8.          elif [ "$1" = "-o" ]
  9.               then
  10.                     outfile=" $2 "
  11.                     shift 2
  12.          else
  13.               echo " program $0 does not recognize optoin $1 "
  14.       fi
  15. done
  16. tr a-z A-Z <$infile>$outfile
  17. #end
复制代码

比如说,这个代码的文件名是zhuanhuan,加上X属性后,把另个文件tfm.txt里的小写全部转换成大写
执行:./zhuanhuan -i tfm.txt -o tfm.out
那么tfm.out里面就都应该是大写了
我看不懂的是这个shift命令,他的作用是将命令行的参数左移动,shift 2就是左移2位,如
./zhuanhuan -i tfm.txt,shift 2后,只剩下$0也就是./zhuanhuan本身了,那和光执行./zhuanhuan不加任何参数有什么区别呢,如果第一个参数不是-i他就直接跳到else了,根本不会执行elif,谁懂这个代码,给我一步步跟在后面解释一下好吗?谢谢大哥啊!
 楼主| 发表于 2005-4-27 22:24:44 | 显示全部楼层

帮助,两个基本参数的区别?

我刚学shell编程,不知道$@和$*有什么区别;书上解释说
$@是存储命令行所有输入的参数;
$*是存储shell的所有参数;
他们用的时候有什么区别,分别在什么情况才用到$@而不是$*,或者是$*而不是$@,能给举个例子说明一下吗?谢谢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-27 22:26:47 | 显示全部楼层

帮助,两个基本参数的区别?

--------------------------------------------------------------------------------


我刚学shell编程,不知道$@和$*有什么区别;书上解释说
$@是存储命令行所有输入的参数;
$*是存储shell的所有参数;
他们用的时候有什么区别,分别在什么情况才用到$@而不是$*,或者是$*而不是$@,能给举个例子说明一下吗?谢谢
回复 支持 反对

使用道具 举报

发表于 2005-4-27 23:44:06 | 显示全部楼层
看看这个有没有帮助:
为shell脚本指定的变元被存在两个特殊的变量$*和$@中。这两个变量之间的差别在于如何存储变元:$*不保存引用,而$@则保存。
$*的行为有时候会产生一些问题,例如你的脚本aa中包含for循环操作有空格的文件名作为变元:
$ aa "my shell 1.conf"
使用$*代替$@将会产生一个问题,因为for循环将对文件my , shell, 1.conf执行三次,你所要求的文件 my shell 1.conf只需要一次。使用$@,就可以避免这个问题,因为每个变元都别当作引用而保存。
$@ 和 $* 在不加引号使用的时候是一样的,但是如果加上引号,"$@" 还是被shell解释为单独的位置变量,而 "$*" 则被认为是一个变量,简单来说就可以认为 "$*" 是一个字符串。
在shell中也有数组的概念,类似上面的,也有 "$@" 和 "$*"。比如 ${array[@]} 和 ${array
  • }.
  • 回复 支持 反对

    使用道具 举报

    发表于 2005-4-27 23:52:21 | 显示全部楼层
    Post by zhy2111314
    看看这个有没有帮助:
    为shell脚本指定的变元被存在两个特殊的变量$*和$@中。这两个变量之间的差别在于如何存储变元:$*不保存引用,而$@则保存。
    $*的行为有时候会产生一些问题,例如你的脚本aa中包含for循环操作有空格的文件名作为变元:
    $ aa "my shell 1.conf"
    使用$*代替$@将会产生一个问题,因为for循环将对文件my , shell, 1.conf执行三次,你所要求的文件 my shell 1.conf只需要一次。使用$@,就可以避免这个问题,因为每个变元都别当作引用而保存。
    $@ 和 $* 在不加引号使用的时候是一样的,但是如果加上引号,"$@" 还是被shell解释为单独的位置变量,而 "$*" 则被认为是一个变量,简单来说就可以认为 "$*" 是一个字符串。
    在shell中也有数组的概念,类似上面的,也有 "$@" 和 "$*"。比如 ${array[@]} 和 ${array
  • }.

  • 学习ing
    回复 支持 反对

    使用道具 举报

    发表于 2005-4-27 23:55:25 | 显示全部楼层
    #我不懂这里赋值时,为什么要加双引号,而不是infile= $2,什么情况下赋值时候才加双引号,兄弟们能告诉我吗?

    通常情况下赋值不用加双引号,但是在将某些特殊meta赋给变量时就需要加双引号,比如:
    1. zhyfly@zhyfly:~/bash$ a=eet wet
    2. bash: wet: command not found
    3. zhyfly@zhyfly:~/bash$ a="eet wet"
    4. zhyfly@zhyfly:~/bash$ echo $a
    5. eet wet
    6. zhyfly@zhyfly:~/bash$
    复制代码

    在这里,空格是作为IFS(Internal Field Seperator,通常空格,制表符,回车会作为IFS),因此必须用双引号引起才可以赋给变量!
    还有单引号,双引号在shell中的简单区别就是
    单引号 将所有的内容都作为普通字符处理
    双引号 除了" $ \ `(反引号,键盘上1左边的键)(我就总结出这四个,不知道还有其他的吗?)外都作为普通字符处理
    比如:
    1. zhyfly@zhyfly:~/bash$ echo "$a"
    2. eet wet
    3. zhyfly@zhyfly:~/bash$ echo '$a'
    4. $a
    5. zhyfly@zhyfly:~/bash$
    复制代码

    其他的想了解更多就自己搜索看吧
    至于这个脚本,读起来应该不难,如果还有什么不懂再讨论好吧!
    回复 支持 反对

    使用道具 举报

    发表于 2005-4-28 00:55:30 | 显示全部楼层
    建议可以看看home_king版主的精帖: 【Bash命令行处理】[详解] http://www.linuxsir.cn/bbs/showthread.php?t=99465
    回复 支持 反对

    使用道具 举报

     楼主| 发表于 2005-4-28 16:17:23 | 显示全部楼层
    谢谢大家的回复啊,看来我还的慢慢来,一些东西还是不能理解,比如上面的这个代码中shift作用
    ./zhuanhuan -i tfm.txt -o tfm.out这样正确
    ./zhuanhuan -o tfm.out -i tfm.txt这样也能正确运行
    但是./zhuanhuan -p或者随便一个其他的参数,他就会一直显示
    program ./zhuanhuan does not recognize optoin -p
    怎么让他出错后只显示一行后停止呢?
    上面的代码,能给一步一步在每个代码的后面说明原理就更好了,谢谢
    回复 支持 反对

    使用道具 举报

    发表于 2005-4-28 17:18:37 | 显示全部楼层
    Post by tianfuming
    谢谢大家的回复啊,看来我还的慢慢来,一些东西还是不能理解,比如上面的这个代码中shift作用
    ./zhuanhuan -i tfm.txt -o tfm.out这样正确
    ./zhuanhuan -o tfm.out -i tfm.txt这样也能正确运行
    但是./zhuanhuan -p或者随便一个其他的参数,他就会一直显示
    program ./zhuanhuan does not recognize optoin -p
    怎么让他出错后只显示一行后停止呢?

    出了错误的错误信息可以输出到/dev/null,这个就是关于stdin,stdout,stderr的了
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    快速回复 返回顶部 返回列表