LINUX.ORG.RU

case или if ?

 


1

2

Доброго времени суток, хотел спросить.Что лучше использовать case или if для таких задач:

На примере функции:

function buildfunct {
  croot
  case "$CURRENTDEVICE" in
    taoshan) breakfast taoshan
    ;;
    grouper) breakfast grouper
    ;;
    *) echo "Error, corrent typo"
  esac
  mka bacon
}

Или лучше использовать на примере с if ?

function buildfunct {
  croot
  if [ "$CURRENTDEVICE" == "taoshan" ]; then
    breakfast taoshan
  elif [ "$CURRENTDEVICE" == "grouper" ]; then
    breakfast grouper
fi
  mka bacon
}

Какая разница между использования этих вариантов?

Deleted

case намного аккуратнее и нагляднее

Deleted
()
Ответ на: комментарий от MyTrooName

Знаю что кроме меня никто читать не будет, но вдруг есть какая-то разница в использовании памяти/etc

Использую if и case в скриптах но иногда через case удобнее прописать два варианта в одну строчку а-ля

true|auto) выполнить какое-то действие

Нежели писать два if под две операции

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от Deleted

По ммм(imho) case логичней, лаконичней, красивей.
if...elif...fi когда проверка не одной переменной.
А по памяти…/etc., а не пофиг? пока нет большого потребления памяти/времени/другого ресурса.
Т.е. я имею ввиду, что пишешь ты для человека(себя, другого не важно)

anonymous
()
Ответ на: комментарий от Deleted

Нежели писать два if под две операции

Можно так:

if [ "$var" = "true" ] || [ "$var" = "auto" ]; then выполнить какое-то действие
Но case для одной переменной читабельнее, конечно...

Evenik ★★
()

В каком-то из моих тестов case работал быстрее аналогичного кода с if. Но разница там была очень незначительной. Для себя руководствуюсь праивлом - если > 2 вариантов всегда пишу с case.

Кстати, в case не регулярки, а глобы, что иногда определяет выбор в пользу if [[ =~ ]].

RiD
()
Ответ на: комментарий от anonymous

вообще-то сие тоже регулярка, только примитивная

Globs do not include syntax for the Kleene star which allows multiple repetitions of the preceding part of the expression; thus they are not considered regular expressions, which can describe the full set of regular languages over any given finite alphabet.[citation needed]

«[citation needed]» сознательно оставил, поскольку не уверен, хотя звучит логично.

anonymous
()

В данном случае нужно:

а) перевести переданный параметр в нижний регистр

б) проверить корректность параметра по наличию соотв. ключа в заранее сформированном хэш-массиве (намного быстрее проверки регуляркой)

в) передать параметр в функцию breakfast, если такой ключ есть или не передавать и вопить об ошибке, если нет

Всё! Причём здесь вообще case???

DRVTiny ★★★★★
()
Ответ на: комментарий от Deleted

Для описанного Вами случая точно не нужно 2 if'а.

Что проникнуться, посмотрите штатный скрипт configure в исходниках какой-нибудь OpenSource-программы: там иногда между if и then вставлены километры «проверочного» кода, вплоть до компиляции динамически созданного файла с исходниками на каком-нибудь языке

DRVTiny ★★★★★
()

Не учитывая всей кривости, смехотворности и вырвиглазности синтаксиса шелла, очевидно, case удобнее, как и при использовании на переменных такого вида, так и при чтении кода. if только для boolean или если не предполагается else.

Deleted
()

А куда в примере с if, else подевалось?

else
    echo "Error, corrent typo"
Так в case, явно меньше букв.

ashot ★★★★
()
Ответ на: комментарий от DRVTiny

перевести переданный параметр в нижний регистр

Почему?

хэш-массиве

А разве в баше такой термин используется? Там же вроде: ассоциативный массив.

ashot ★★★★
()
Ответ на: комментарий от ashot

Почему?

Можно не переводить, если регистр критичен. Судя по примеру, не должен бы быть критичным.

А разве в баше такой термин используется?

Ну Вы же поняли, о чём идёт речь? Я использую этот термин. Значит, используется как минимум мной.

DRVTiny ★★★★★
()
Ответ на: комментарий от Deleted

Но case не поддерживает нормальные регекспы. Зато extglob'ы поддерживает, а они во многом могут заменить простые регекспы. Хотя понятности синтаксису BASH'а они и не добавляют :)

Только в описанном случае вообще не нужны ни if'ы, ни case'ы.

DRVTiny ★★★★★
()
Ответ на: комментарий от DRVTiny

Ну Вы же поняли, о чём идёт речь?

Ну я то на перле хеллоуворды пишу, а ТС вряд ли. О нем речь.

ashot ★★★★
()
Ответ на: комментарий от DRVTiny

Но case не поддерживает нормальные регекспы.

Зависит от языка.

Deleted
()
[ "$CURRENTDEVICE" == "taoshan"] &&
  breakfast taoshan ||
  [ "$CURRENTDEVICE" == "grouper" ] &&
    brakfast grouper
evilface ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.