Using case for a range of numbers in Bash

前端 未结 5 685
忘掉有多难
忘掉有多难 2020-11-29 06:59

I am trying to do the following using case in Bash (in Linux).

If X is between 460 and 660, output X information.

If X is between 661 and 800, d

相关标签:
5条回答
  • 2020-11-29 07:16

    I was looking for the simplest solution and found it difficult to use a case statement with a number range .

    Finally i found a really simple solution for zsh :

      #!/usr/bin/zsh 
    
     case "${var}" in
    
     <0-5461>)
    
     printf "${var} is between 0 and 5461"
    
     ;;
    
     <5462-10922>)
    
    printf "${var} is between 5462-10922"
    
     ;;
    
     esac
    

    and for Bash :

      #!/bin/bash
    
     case $((   
    
    (var >= 0 && var <= 5461)      * 1 +   
    
    (var > 5462 && var  <= 10922)   * 2)) in   
    
    (1) printf "${var} is between 0 and 5461";; 
    
    (2) printf "${var} is between 5461 and 10922";; 
    
    esac
    

    Hope it helps someone .

    0 讨论(0)
  • 2020-11-29 07:17

    Similar issue which might be useful to someone ... Random additional thing I just tried out where it checks also that it is an integer, for me I wanted it to have a preset value, let the user change it, if they input the wrong data it sets to default.

        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
    
        }
    

    Another example using 'case' to check that a variable is in a range of integers :

    check that $MAX is a number and that it's between 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
    
    0 讨论(0)
  • 2020-11-29 07:19

    In bash, you can use the arithmetic expression: ((...))

    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
    
    0 讨论(0)
  • 2020-11-29 07:19

    Just for the pleasure of subverting case to do as you want, you can use $((...))

    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 讨论(0)
  • 2020-11-29 07:28

    The bash case statement doesn't understand number ranges. It understands shell patterns.

    The following should work:

    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
    

    However, I'd recommend you use an if-else statement and compare number ranges as in the other answer. A case is not the right tool to solve this problem. This answer is for explanatory purposes only.

    0 讨论(0)
提交回复
热议问题