bash, case

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Ответить
Аватара пользователя
agent-mega
Сообщения: 505
Статус: Автономный модуль
Контактная информация:

bash, case

Сообщение agent-mega »

Можно ли сделать конструкцию вида:

Код: Выделить всё

case что-то-там in
a>b ) такие-то действия;;
a<b ) такие-то действия;;
a=b ) такие-то действия;;
esac


Вопрос собственно в синтаксисе и что писать между case и in? Не встречал таких примеров.
DEBIAN & DEBIAN-BASED ONLY

Всё относительно. Объективности не существует.
Спасибо сказали:
Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус
Контактная информация:

Re: bash, case

Сообщение KiWi »

а if релизия запрещает использовать?
Спасибо сказали:
Аватара пользователя
agent-mega
Сообщения: 505
Статус: Автономный модуль
Контактная информация:

Re: bash, case

Сообщение agent-mega »

Нет, не запрещает, конечно, но с case красивей :)
Ну что это за...:

Код: Выделить всё

if [ "$a" -ne "$b" ]
then
  if [ "$a" -gt "$b" ]
  then
    echo "a>b"
  else
    echo "a<b"
  fi
else
  echo "a=b"
fi

В си switch вроде есть такой... он всё может.. а case, что, нет?
DEBIAN & DEBIAN-BASED ONLY

Всё относительно. Объективности не существует.
Спасибо сказали:
Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус
Контактная информация:

Re: bash, case

Сообщение KiWi »

(agent-mega @ Dec 15 2005, в 22:47) писал(а):В си switch вроде есть такой

меня прут такие "вроде"

если ты про switch(a > B), то что мешает написать ТО ЖЕ САМОЕ на bash?

P.S.: в bash есть elif
P.P.S.:

Код: Выделить всё

[ $A -eq $B ] && echo 'a=b' || ( [ $A -gt $B ] && echo 'a>b' || echo 'a<b' )
Спасибо сказали:
Аватара пользователя
agent-mega
Сообщения: 505
Статус: Автономный модуль
Контактная информация:

Re: bash, case

Сообщение agent-mega »

2IFL: ну крут, крут ты... я же только учусь B)

thx.
DEBIAN & DEBIAN-BASED ONLY

Всё относительно. Объективности не существует.
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга
Контактная информация:

Re: bash, case

Сообщение madskull »

Не деритесь, горячие эстонские парни.
Есть case, и если сделать man bash и поиск по слову case, то можно в этом убедиться.

Использование

Код: Выделить всё

case "$var" in
  aaa) echo "aaa";;
  b*) echo "начинается на b";;
  *) echo "что-то другое";;
esac

Вариантов, когда в качестве условия выбора выступают условия :) нет.

А вообще, Advanced Bash Scripting Guide.
ArchLinux / IceWM
Спасибо сказали:
Аватара пользователя
nercus
Сообщения: 150

Re: bash, case

Сообщение nercus »

мой вариант:

Код: Выделить всё

#!/bin/bash

A=3
B=2

case "$(($A < $B))$(($A > $B))" in
    10) # <
        echo '<'
       ;;
    01) # >
        echo '>'
       ;;
    00) # ==
        echo '=='
       ;;
esac
2.6.14-gentoo-r5
kde-3.5.0 | openbox-3.2
Deep Purple | Rob Zombie | Led Zeppelin | ДДТ
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга
Контактная информация:

Re: bash, case

Сообщение madskull »

nercus писал(а):
16.12.2005 01:20
мой вариант:

Код: Выделить всё

#!/bin/bash

A=3
B=2

case "$(($A < $B))$(($A > $B))" in
    10) # <
        echo '<'
      ;;
    01) # >
        echo '>'
      ;;
    00) # ==
        echo '=='
      ;;
esac


Ч-черт! Через ж..., но красиво и оригинально!
ArchLinux / IceWM
Спасибо сказали:
Аватара пользователя
Dark_Savant
Бывший модератор
Сообщения: 1100
Статус: киборг
ОС: Cyborg OS 0.0.1.3

Re: bash, case

Сообщение Dark_Savant »

ага, вот потому я никогда и не спрашиваю "можно ли ?", а спрашиваю "как ?" 8)
I'm a tragic hero
In this game called life
My chances go to zero
But I always will survive
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: bash, case

Сообщение t.t »

(agent-mega @ Dec 15 2005, в 22:47) писал(а):В си switch вроде есть такой... он всё может..
О, всемогущий свич! :) Нет, не всё. Он может только проверить _целочисленное_ выражение на соответствие одному из _конечного_ набора _фиксированных_ значений; т.е. по сути даже меньше, чем башевский.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: bash, case

Сообщение t.t »

Первое, что мне пришло в голову на сях именно со свичом, это, кстати, вариант nercus'а:

Код: Выделить всё

switch((a<b)-(a>b))
{case 0: putchar('='); break;
 case 1: putchar('<'); break;
 case -1: putchar('>');
}
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
flook
Сообщения: 585
Статус: Просто flook

Re: bash, case

Сообщение flook »

t.t писал(а):
16.12.2005 14:26
(agent-mega @ Dec 15 2005, в 22:47) писал(а):В си switch вроде есть такой... он всё может..
О, всемогущий свич! :) Нет, не всё. Он может только проверить _целочисленное_ выражение на соответствие одному из _конечного_ набора _фиксированных_ значений; т.е. по сути даже меньше, чем башевский.

Зато на нем можно устроить знаменитый Duffs Device :)
В каждом из нас спит гений... и с каждым днем все крепче...
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: bash, case

Сообщение t.t »

(flook @ Dec 16 2005, в 15:18) писал(а):знаменитый Duffs Device
?
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
flook
Сообщения: 585
Статус: Просто flook

Re: bash, case

Сообщение flook »

t.t писал(а):
16.12.2005 15:40
(flook @ Dec 16 2005, в 15:18) писал(а):знаменитый Duffs Device
?

Ну что же вы... :huh:

Код: Выделить всё

send(short *to, short *from, int count)
{
    int n=(count+7)/8;
    switch(count%8){
        case 0:    do{   *to = *from++;
        case 7:        *to = *from++;
        case 6:        *to = *from++;
        case 5:        *to = *from++;
        case 4:        *to = *from++;
        case 3:        *to = *from++;
        case 2:        *to = *from++;
        case 1:        *to = *from++;
            }while(--n>0);
    }
}
В каждом из нас спит гений... и с каждым днем все крепче...
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: bash, case

Сообщение t.t »

(flook @ Dec 16 2005, в 15:58) писал(а):Ну что же вы...
И правда, забыл совсем :) Буду теперь знать, как это называется, кстати.

ЗЫ: мы вроде на "ты" были?
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: bash, case

Сообщение elide »

мрачный код.... если не знать, что это такое, то можно подумать, что у тебя белка.......
слава роботам!
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга
Контактная информация:

Re: bash, case

Сообщение madskull »

Кстати, чтоб нам не думать, что у него белка - что это?
ArchLinux / IceWM
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: bash, case

Сообщение elide »

ну это такой способ loop unwinding.
сокращает накладные расходы на каждое пересылаемое слово.
свитч нужен для копирования куска данных, если размер не кратен 8 словам.
т.е. если count == 85, count%8 == 5
из switch попадаем на case 5 и копируется 5 слов. а потом switch игнорируется и идет простой цикл по 8 копирований. вобщем - все просто.
но я бы никогда не додумался до такого изврата....... я вообще, пока не проверил, сомневался, что эта конструкция синтаксически валидна....
слава роботам!
Спасибо сказали:
Аватара пользователя
flook
Сообщения: 585
Статус: Просто flook

Re: bash, case

Сообщение flook »

t.t писал(а):
16.12.2005 19:21
ЗЫ: мы вроде на "ты" были?

B)
В каждом из нас спит гений... и с каждым днем все крепче...
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: bash, case

Сообщение t.t »

(elide @ Dec 17 2005, в 17:02) писал(а):я вообще, пока не проверил, сомневался, что эта конструкция синтаксически валидна....
Угу, я тоже :)
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
flook
Сообщения: 585
Статус: Просто flook

Re: bash, case

Сообщение flook »

elide писал(а):
17.12.2005 17:02
ну это такой способ loop unwinding.
сокращает накладные расходы на каждое пересылаемое слово.
свитч нужен для копирования куска данных, если размер не кратен 8 словам.
т.е. если count == 85, count%8 == 5
из switch попадаем на case 5 и копируется 5 слов. а потом switch игнорируется и идет простой цикл по 8 копирований. вобщем - все просто.
но я бы никогда не додумался до такого изврата....... я вообще, пока не проверил, сомневался, что эта конструкция синтаксически валидна....


Век живи... :rolleyes:
В каждом из нас спит гений... и с каждым днем все крепче...
Спасибо сказали:
Аватара пользователя
G@riK
Сообщения: 54
Контактная информация:

Re: bash, case

Сообщение G@riK »

а как заставить case понимать русские буквы?
Ибу ибуди - ху_ида_о муди - [Шаг за шагом можно достигнуть цели (кит.)]
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: bash, case

Сообщение elide »

G@riK
лучше расскажи нам, как ты заставил его НЕ понимать русские буквы....
потому как сам по себе он их очень даже нормально понимает.
слава роботам!
Спасибо сказали:
Аватара пользователя
G@riK
Сообщения: 54
Контактная информация:

Re: bash, case

Сообщение G@riK »

элементарно:

констуркция такого вида

Код: Выделить всё

case "$i" in

[A-Z] ) "делаем что нить";;
[а-я] ) "делаем что нить";;
[А-Я] ) "делаем что нить";;

esac


[а-Я] тоже не катит...

вот так вот...
Ибу ибуди - ху_ида_о муди - [Шаг за шагом можно достигнуть цели (кит.)]
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: bash, case

Сообщение elide »

Код: Выделить всё

elide@rebirth| ~ >> test(){
>         echo -n "$1 = "
>         case "$1" in
>                 [a-z]) echo английские маленькие;;
>                 [A-Z]) echo английские большие;;
>                 [ю-ъ]) echo русские маленькие;;
>                 [Ю-Ъ]) echo русские большие;;
>         esac
>         echo
> }
elide@rebirth| ~ >> test a
a = английские маленькие

elide@rebirth| ~ >> test d
d = английские маленькие

elide@rebirth| ~ >> test z
z = английские маленькие

elide@rebirth| ~ >> test S
S = английские большие

elide@rebirth| ~ >> test G
G = английские большие

elide@rebirth| ~ >> test J
J = английские большие

elide@rebirth| ~ >> test Ф
Ф = русские большие

elide@rebirth| ~ >> test Я
Я = русские большие

elide@rebirth| ~ >> test ц
ц = русские маленькие

elide@rebirth| ~ >> test л
л = русские маленькие
элементарно. ага.
слава роботам!
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: bash, case

Сообщение t.t »

(elide @ Apr 2 2006, в 16:46) писал(а):элементарно. ага.
Угу. А в koi8, к примеру, кирилические буквы вовсе даже и не подряд идут. Или где?
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
G@riK
Сообщения: 54
Контактная информация:

Re: bash, case

Сообщение G@riK »

у меня локаль UTF8, а файл перекодирован в KOI8-R, из которого и берётся эта буковка русская...
Ибу ибуди - ху_ида_о муди - [Шаг за шагом можно достигнуть цели (кит.)]
Спасибо сказали:
Аватара пользователя
G@riK
Сообщения: 54
Контактная информация:

Re: bash, case

Сообщение G@riK »

ну что, никто не знает?
Ибу ибуди - ху_ида_о муди - [Шаг за шагом можно достигнуть цели (кит.)]
Спасибо сказали:
Ответить