2012-09-27 5 views
14

Próbuję wykonać następujące czynności, używając case w Bash (w systemie Linux).Używanie obudowy dla zakresu numerów w Bash

Jeśli X mieści się w przedziale od 460 do 660, wyświetla informacje X.

Jeśli X ma wartość od 661 do 800, zrób coś innego.

Itd

Teraz to jest to, co mam:

case $MovieRes in 
    [461-660]*) echo "$MovieName,480p" >> moviefinal ;; 
    [661-890]*) echo "$MovieName,720p" >> moviefinal ;; 
    [891-1200]*) echo "$MovieName,1080p" >> moviefinal ;; 
    *) echo "$MovieName,DVD" >> moviefinal ;; 
esac 

Ale jakoś wiele z tych, które są 480p, 720p lub 1080p są kończąc na DVD zamiast. Zmienna $MovieRes jest prostą listą, która dla każdej linii zawiera liczbę od 1 do 1200. W zależności od wartości, case decyduje, który "przypadek" zastosować.

Chciałbym wiedzieć, jak faktycznie użyć case, aby to osiągnąć, ponieważ jest nieco mylące, gdy mamy do czynienia z takimi zakresami.

+0

"Ale jakoś wiele z nich" ... Nie jestem do końca pewien, do których "tu" się odnosi. Możesz wyjaśnić? –

Odpowiedz

21

W bashu można użyć arithmetic expression: oświadczenie ((...))

if ((461<=X && X<=660)) 
then 
    echo "480p" 
elif ((661<=X && X<=890)) 
then 
    echo "720p" 
elif ((891<=X && X<=1200)) 
then 
    echo "1080p" 
else 
    echo "DVD" 
fi >> moviefinal 
19

Bash case nie rozumie liczba waha. Rozumie shell patterns.

Poniższa powinno działać:

case $MovieRes in 
    46[1-9]|4[7-9][0-9]|5[0-9][0-9]|6[0-5][0-9]|660) echo "$MovieName,480p" >> moviefinal ;; 
    66[1-9]|6[7-9][0-9]|7[0-9][0-9]|8[0-8][0-9]|890) echo "$MovieName,720p" >> moviefinal ;; 
    89[1-9]|9[0-9][0-9]|1[0-1][0-9][0-9]|1200)  echo "$MovieName,1080p" >> moviefinal ;; 
    *)            echo "$MovieName,DVD" >> moviefinal ;; 
esac 

Jednakże, polecam użyć if-else i porównać ilość waha się, jak w drugiej odpowiedzi. A case nie jest właściwym narzędziem do rozwiązania tego problemu. Ta odpowiedź ma wyłącznie charakter objaśniający.

+0

Dziękuję psom. Teraz tutaj jest problem, odpowiedź brzmi poprawnie, czego szukałem, ale jak już wspomniałeś, nie byłby to właściwy sposób robienia tego. Prawidłowym/łatwiejszym sposobem byłoby użycie odpowiedzi Keva. Czy powinienem: 1. Zaakceptować odpowiedź jako poprawną odpowiedź i dać Kev +1 lub 2. Czy mam przyjąć odpowiedź Kev jako właściwą i dać +1. Pytam, ponieważ oboje w jakiś sposób odpowiadasz poprawnie. –

+1

Odpowiedź IMO kev powinna zostać zaakceptowana, ponieważ to właśnie Ty (i wszyscy inni odwiedzający tę stronę) powinniście używać. Ale nie miałbym nic przeciwko +1! Dzięki :) – dogbane

12

Tylko dla przyjemności obalenia sprawy do zrobienia, jak chcesz, można użyć $((...))

case 1 in 
    $(($MovieRes<= 460)))echo "$MovieName,???";; 
    $(($MovieRes<= 660)))echo "$MovieName,480p";; 
    $(($MovieRes<= 890)))echo "$MovieName,720p";; 
    $(($MovieRes<=1200)))echo "$MovieName,1080p";; 
         *)echo "$MovieName,DVD";; 
esac >> moviefinal 
0

podobny problem co może być przydatne dla kogoś ... Losowy dodatkową rzeczą Ja tylko starałem się, gdzie kontrole również, że jest to liczba całkowita, dla mnie chciałem, aby miał on ustawioną wartość, niech użytkownik ją zmieni, jeśli wprowadzi nieprawidłowe dane, które ustawi jako domyślne.

func_set_num_files(){ 
     echo "How many files do you want to create? (input a number 1-10000)" 
     read X 
     # 1, is it a number, #2 is it within max range? 
     if [[ $X != *[!0-9]* ]]; then 

      if ((1<=X && X<=10000)) ;then 
         echo "NUM_FILES=$X" 
         NUM_FILES=$X 
       else 
         echo "Invalid input, setting to default value [ $NUM_FILES ].";sleep 3 
      fi 

     else 
      echo "Invalid input, non-numeric values entered, setting to default value [ $NUM_FILES ].";sleep 3 
     fi 

    } 

Innym przykładem używając „przypadek”, aby sprawdzić, czy zmienna jest w zakresie liczb całkowitych:

Sprawdź, $ MAX jest liczbą i że jest między 50-100:

  case $MAX in 
       ''|*[!0-9]*) 
        echo "The value $MAX is not a number !" 
        exit 1 
       ;; 
       *) 
        if [ $MAX -lt 50 ] || [ $MAX -gt 100 ] ;then 
         echo "The value $MAX is not between 50-100" 
         exit 1 
        fi 
        echo "Looks like we are good !" 
       ;; 
      esac