什么是"正确的"的方式来做到以下作为一个布尔的表达吗?

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
...
有帮助吗?

解决方案

其他的解决方案有几种常见的错误: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. -a 是效率低下,如果 stating文件,因为它没有短路(我知道这上面是不是 stating文件)。

因此,而不是尝试:

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

其他提示

甚至短:

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 在如果表达相当于布尔,并在贝壳测试。更多看到的 man test

考虑使用 情况下 声明:

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
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

为未来的参考,新的[[测试操作者优先。所接受的答案是关闭和一切所提到的适用,但这个问题的答案将需要大量引用,并呼吁多次测试。

优选的方法将是什么样的:

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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top