2008-09-07 110 views
11

什么是以正确的方式将下列内容作为布尔表达式执行的?Shell脚本中的布尔表达式

for i in `ls $1/resources`; do 
    if [ $i != "database.db" ] 
    then 
     if [ $i != "tiles" ] 
     then 
      if [ $i != "map.pdf" ] 
      then 
       if [ $i != "map.png" ] 
       then 
        svn export -q $1/resources/$i ../MyProject/Resources/$i 
... 

回答

11

其他的解决方案有几个常见的错误: http://www.pixelbeat.org/programming/shell_script_mistakes.html

  1. for i in $(ls ...)是多余的/有问题 只是做:for i in $1/resources*; do ...

  2. [ $i != file1 -a $1 != file2 ]这实际上有2个问题。

    a。 $i未被引用,因此具有空格的名称将导致问题

    b。因为它不会短路(我知道上面不是stat ing文件),所以-a效率不高。

因此,而不是尝试:

for i in $1/resources/*; do 
    if [ "$i" != "database.db" ] && 
     [ "$i" != "tiles" ] && 
     [ "$i" != "map.pdf" ] && 
     [ "$i" != "map.png" ]; then 
     svn export -q "$i" "../MyProject/Resources/$(basename $i)" 
    fi 
done 
1
for i in `ls $1/resources`; do 
    if [ $i != "database.db" ] && [ $i != "tiles" ] && [ $i != "map.pdf" ] && [ $i != "map.png" ]; then 
     svn export -q $1/resources/$i ../MyProject/Resources/$i 
7

即使较短:

for i in `ls $1/resources`; do 
    if [ $i != databse.db -a $i != titles -a $i != map.pdf ]; then 
    svn export -q $1/resources/$i ../MyProject/Resources/$i 
    fi 
done; 

在该-a如果表达式是布尔AND壳式测试的等效。欲了解更多看到man test

3

考虑使用情况声明:

for i in $(ls $1/resources); do 
    case $i in 
     database.db|tiles|map.pdf|map.png) 
      ;; 
     *) 
      svn export -q $1/resources/$i ../MyProject/Resources/$i;; 
    esac 
done 
0

以供将来参考,新[测试操作是首选。接受的答案是接近的,所有提到的都适用,但这个答案将需要大量的引用和调用多个测试。

优选的方法会是这样:

for i in $1/resources/*; do 
    if [[ $i != "database.db" && $i != "tiles" && 
       $i != "map.pdf" && $i != "map.png" ]]; then 
     svn export -q "$i" "../MyProject/Resources/$(basename $i)" 
    fi 
done