Shell脚本中的布尔表达式

时间:2020-03-05 18:49:03  来源:igfitidea点击:

以布尔表达式执行以下操作的"正确"方法是什么?

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

解决方案

回答

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

回答

甚至更短:

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

if表达式中的-a与shell测试中的布尔AND等效。有关更多信息,请参见man test

回答

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

  • 对于$(ls ...)中的i来说是多余的/有问题的,只是这样做:对于$ 1 /资源中的i *。做...
  • [$ i!= file1 -a $ 1!= file2]实际上有两个问题。一种。 $ i不加引号,因此带空格的名称将引起问题b。如果stat正在归档文件,则-a效率不高,因为它不会短路(我知道上面的内容不是stating文件)。

因此,请尝试:

for i in /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

回答

考虑使用一个case语句:

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