|
发表于 2005-5-28 01:28:38
|
显示全部楼层
Post by herberteuler
Shell 的一个重要功能是 Shell 替换。比如说,你可以用 *.sh 来表示一个目录里所有以 .sh 结束的文件。这个功能很方便,但是也要当心,特别是当你要写一个 Shell 程序时。为什么呢?因为如果目录里没有满足要求的文件,Shell 不会做任何替换:
- $ ls -a
- . .. x
- $ cat x
- #!/bin/sh
- for i in $1 ; do
- echo "${i}"
- done
- $ ./x 'x*'
- x
- $ ./x '*'
- x
- $ ./x 'a*'
- a*
- $
复制代码
如果把上面的程序片段应用到大一些的 Shell 程序里,很可能会出错误。最好的解决办法是自己写一个函数来完成本来是由 Shell 来完成的替换功能,这样保证不会出错误:
- $ cat x
- #!/bin/sh
- # allfiles(string dir, string filter)
- allfiles()
- {
- test -z "$2" && set "$1" '*'
- local s="$(echo $1/$2)"
- test "${s}" = "$1/$2" && return
- for i in $(echo $1/$2) ; do
- ( test "$(basename "${i}")" = '.' || test "$(basename "${i}")" = '..' ) && continue
- echo ${i} | sed 's/ /\\ /g
- s/ /\\ /g'
- done
- }
- allfiles . "$1"
- $ ./x 'a*'
- $
复制代码
这种情况一般在rc中出现较多,还有就是profile.d中,一般简单地在for loop中增加一个判断就可以了,例如
- for i in /etc/rcS.d/S*; do
- [[ ! -f $i ]] && continue
- $i start
- done
复制代码
原因是Sxx这个symlink的对应文件可能不存在。。。 |
|