2014-02-20 1 views
4

Эй, ребята, я пытаюсь понять разумный способ сделать предложение НЕ в случае. Причина, по которой я это делаю, заключается в перекодировке , когда дело выполнено, иначе, если я попаду на avi, нет причин снова превращать его в avi, я могу просто сдвинуть его с пути (это то, что диапазон у основания моего дела должен do). Во всяком случае, у меня есть код proto, который я написал, что дает то, что я пытаюсь сделать.BASH не в случае

#!/bin/bash 
for i in $(seq 1 3); do 

    echo "trying: $i" 

    case $i in 
     ! 1) echo "1" ;;  # echo 1 if we aren't 1 
     ! 2) echo "2" ;;  # echo 2 if we aren't 2 
     ! 3) echo "3" ;;  # echo 3 if we aren't 3 
     [1-3]*) echo "! $i" ;; # echo 1-3 if we are 1-3 
    esac 

    echo -e "\n" 

done 

ожидаемые результаты могли бы быть что-то вроде этого

2 3 ! 1 
1 3 ! 2 
1 2 ! 3 

Помощь ценится, спасибо.

+1

Вы понимаете, что 'case' будет, по дизайну, выполнять только одну вещь за вызов? –

+0

... как дополнительный, '$ (seq 1 3)' не переносится - 'seq' не является стандартизованной POSIX-командой, и на многих платформах нет. Лучше использовать цикл C-стиля, т.е. 'for ((i = 1; i <= 3; i ++)); do' –

+0

@CharlesDuffy Я этого не сделал, я думал, что он более гибкий, как php и т. д. – ehime

ответ

6

Это противоречит конструкции case, который выполняет только первый матч. Если вы хотите выполнить несколько совпадений (и в вашем дизайне, то, что равно3 хотел бы выполнить как на 1, так и на 2), то case - неправильная конструкция. Используйте несколько блоков if.

[[ $i = 1 ]] || echo "1" 
[[ $i = 2 ]] || echo "2" 
[[ $i = 3 ]] || echo "3" 
[[ $i = [1-3]* ]] && echo "! $i" 

Поскольку случай выполняет только первое совпадение, имеет смысл иметь только один обработчик «не соответствует»; это то, что для прохода *).

+0

Принято и одобрено, коротко, если работа так же хорошо, на самом деле просто делала это в фоновом режиме, но вы избили меня;) – ehime

2

Вы можете сделать это с расширением extglob.

$ shopt -s extglob 
$ case foo in !(bar)) echo hi;; esac 
hi 
$ case foo in !(foo)) echo hi;; esac 
$ 
+0

Это не будет вести себя как желательно с несколькими шаблонами в одном и том же случае. –

+0

@CharlesDuffy ах, правда. Ну, я оставлю это как есть, отрицательное совпадение по-прежнему полезно для спотыкания. – kojiro

Смежные вопросы