Controllo di un valore in virgola mobile in un intervallo

2

Mi chiedo come posso verificare se un valore in virgola mobile si trova in un determinato intervallo usando "bc" e le istruzioni condizionali in bash. Grazie in anticipo

Ad esempio, voglio scoprire se 17,2 si trova nell'intervallo tra 17,5 e 18,2.

Recentemente ho imparato che posso usare bc per controllare una dichiarazione come questa:

if [ $(bc <<< "$result > 17.5") -eq 1 ]

Ho provato a fare questo if [ $(bc <<< "$result > 17.5") && $(bc <<< "$result <= 18.2") -eq 1 ]

Ma mantieni un errore di sintassi e non sei sicuro che sia l'espressione o la sintassi corretta.

    
posta LjinKazama 11.06.2015 - 15:17

2 risposte

4

Non puoi utilizzare && all'interno di parentesi quadre singole. Tuttavia, hai diverse opzioni:

  1. Utilizza -a all'interno di [ ... ] .

    if [ $(bc <<< "$result > 17.5") -eq 1 -a $(bc <<< "$result <= 18.2") -eq 1 ]
    
  2. Utilizza parentesi quadre doppie [[ ... ]] che supportano && .

    if [[ $(bc <<< "$result > 17.5") == 1 && $(bc <<< "$result <= 18.2") == 1 ]]
    
  3. Utilizza due condizioni [ ... ] separate da && .

    if [ $(bc <<< "$result > 17.5") -eq 1 ] && [ $(bc <<< "$result <= 18.2") -eq 1 ]
    
  4. Puoi utilizzare il confronto tra stringhe sul risultato delle due espressioni

    [[ $( bc <<< "$result > 17.5; %result <= 18.2" ) == $'1\n1' ]]
    
  5. bc comprende && , anche:

    if [[ $(bc <<< "$result > 17.5 && $result <= 18.2") == 1 ]]
    

Preferirei 5 .

    
risposta data choroba 11.06.2015 - 15:24
1

Bash non può gestire i float.

Per prima cosa otteniamo o meno che siano nell'intervallo. Se è vero (1), il numero è compreso nell'intervallo:

test=$(echo "17.5<$result<18.2" | bc)

Quindi verifichiamo che sia vero con un if.

if [ $test -eq 1 ]
then
    echo true
else
    echo false
fi
    
risposta data Tim 11.06.2015 - 15:29

Leggi altre domande sui tag