Булевы выражения в скриптах оболочки - PullRequest
11 голосов
/ 08 сентября 2008

Каков «правильный» способ сделать следующее как логическое выражение?

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 голосов
/ 15 сентября 2008

В других решениях есть пара распространенных ошибок: 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 проблемы.

    а. $i не указан в кавычках, поэтому имена с пробелами вызовут проблемы

    б. -a неэффективен, если stat файлы, так как он не закорачивает (я знаю, что выше не 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 голосов
/ 08 сентября 2008

Еще короче:

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 в выражении if эквивалентно логическому И в shell-тестах. Подробнее см. man test

3 голосов
/ 15 сентября 2008

Рассмотрите возможность использования оператора 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 голос
/ 08 сентября 2008
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
0 голосов
/ 25 июля 2015

Для дальнейшего использования предпочтителен новый [[тестовый оператор. Принятый ответ близок, и все упомянутое применимо, но этот ответ потребует много цитат и призывов к нескольким тестам.

Предпочтительным методом будет что-то вроде:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...