LinuxSir.cn,穿越时空的Linuxsir!

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

Shell 程序设计:当心 Shell 的替换

[复制链接]
发表于 2005-5-27 21:07:17 | 显示全部楼层 |阅读模式
Shell 的一个重要功能是 Shell 替换。比如说,你可以用 *.sh 来表示一个目录里所有以 .sh 结束的文件。这个功能很方便,但是也要当心,特别是当你要写一个 Shell 程序时。为什么呢?因为如果目录里没有满足要求的文件,Shell 不会做任何替换:
  1. $ ls -a
  2. .  ..  x
  3. $ cat x
  4. #!/bin/sh

  5. for i in $1 ; do
  6.         echo "${i}"
  7. done
  8. $ ./x 'x*'
  9. x
  10. $ ./x '*'
  11. x
  12. $ ./x 'a*'
  13. a*
  14. $
复制代码

如果把上面的程序片段应用到大一些的 Shell 程序里,很可能会出错误。最好的解决办法是自己写一个函数来完成本来是由 Shell 来完成的替换功能,这样保证不会出错误:
  1. $ cat x
  2. #!/bin/sh

  3. # allfiles(string dir, string filter)
  4. allfiles()
  5. {
  6.         test -z "$2" && set "$1" '*'
  7.         local s="$(echo $1/$2)"
  8.         test "${s}" = "$1/$2" && return
  9.         for i in $(echo $1/$2) ; do
  10.                 ( test "$(basename "${i}")" = '.' || test "$(basename "${i}")" = '..' ) && continue
  11.                 echo ${i} | sed 's/ /\\ /g
  12.                         s/      /\\     /g'
  13.         done
  14. }

  15. allfiles . "$1"
  16. $ ./x 'a*'
  17. $
复制代码
发表于 2005-5-28 01:28:38 | 显示全部楼层
Post by herberteuler
Shell 的一个重要功能是 Shell 替换。比如说,你可以用 *.sh 来表示一个目录里所有以 .sh 结束的文件。这个功能很方便,但是也要当心,特别是当你要写一个 Shell 程序时。为什么呢?因为如果目录里没有满足要求的文件,Shell 不会做任何替换:
  1. $ ls -a
  2. .  ..  x
  3. $ cat x
  4. #!/bin/sh

  5. for i in $1 ; do
  6.         echo "${i}"
  7. done
  8. $ ./x 'x*'
  9. x
  10. $ ./x '*'
  11. x
  12. $ ./x 'a*'
  13. a*
  14. $
复制代码

如果把上面的程序片段应用到大一些的 Shell 程序里,很可能会出错误。最好的解决办法是自己写一个函数来完成本来是由 Shell 来完成的替换功能,这样保证不会出错误:
  1. $ cat x
  2. #!/bin/sh

  3. # allfiles(string dir, string filter)
  4. allfiles()
  5. {
  6.         test -z "$2" && set "$1" '*'
  7.         local s="$(echo $1/$2)"
  8.         test "${s}" = "$1/$2" && return
  9.         for i in $(echo $1/$2) ; do
  10.                 ( test "$(basename "${i}")" = '.' || test "$(basename "${i}")" = '..' ) && continue
  11.                 echo ${i} | sed 's/ /\\ /g
  12.                         s/      /\\     /g'
  13.         done
  14. }

  15. allfiles . "$1"
  16. $ ./x 'a*'
  17. $
复制代码



这种情况一般在rc中出现较多,还有就是profile.d中,一般简单地在for loop中增加一个判断就可以了,例如

  1. for i in /etc/rcS.d/S*; do
  2.     [[ ! -f $i ]] && continue
  3.     $i start
  4. done
复制代码

原因是Sxx这个symlink的对应文件可能不存在。。。
回复 支持 反对

使用道具 举报

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

本版积分规则

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