Shell脚本中的布尔表达式

11

在布尔表达式中,以下方法哪种是“正确”的方法?

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
...
5个回答

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 ] 实际上有两个问题。

    a. $i 没有使用引号,因此名称中带有空格会导致问题。

    b. 如果使用 stat 命令统计文件,则 -a 不高效,因为它不会短路(我知道上面的例子没有涉及到 stat 命令)。

因此,请尝试使用以下代码:

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

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;

if语句中的-a相当于shell-tests中的布尔运算AND。更多信息请参见man test


3

考虑使用case语句:

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

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

1

作为以后的参考,新的[[测试运算符是首选。 接受的答案接近并且提到的所有内容都适用,但该答案将需要大量引用和调用多个测试。

首选方法应该是类似于:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接