AndraZ
AndraZ

Reputation: 3

Why are my functions not fully executing in a case statement?

I'm as much as a newbie as one can get and have to turn in my first big assignment. Unfortunately, I am lost. Can anyone please tell me what I'm doing wrong? The menu case statement gets displayed, then the echo in the functions as well, but it doesn't get executed, then jumps back to the menu. Thank you!

#! /bin/bash

adauga() {
    printf "Introduceti un numar"
    read numar1
    printf "Introduceti alt numar"
    read numar2
    more
    let suma=$numar1+$numar2
    printf "$numar1 + $numar2 = $suma"
}
factorial () {
    n=0
    nr=0
    fact=1
    echo -n "Introduceti numarul: n= "  
    read n
    more 
    nr=$n   
    while [ $n -ge 1]
    do
        fact=`expr $fact \* $n`
        n=`expr $n - 1`
    done    
    echo "Factorialul numarului $nr este $fact"
}

conversie () {
    n=0
    hex=0
    echo -n "Introduceti numarul in baza 10: n= "   
    read n  
    hex=`echo "obase=16;ibase=10; $n" | bc`
    echo "$n in baza 10 este echivalent cu \"$hex\" in baza 16"
    return
}

while :
do
    clear
    echo " meniu"
    echo "1. Adunarea a 2 numere"
    echo "2. Determinarea factorialului unui numar"
    echo "3. Convertirea unui umar din baza 10 in aza 16"
    echo "4. Exit"
    echo -n "introduceti una din optiunile [1 - 4]"
    read opt
    $opt in
      1) adauga ;;
      2) factorial;;
      3) conversie;;
      4) echo "La revedere $USER";
         exit 1;;
      *) echo "$opt este o optiune invalida.";
         echo "Tasteaza enter pentru a continua .";
         read enterKey;;
    esac
done

Upvotes: 0

Views: 49

Answers (2)

Nikhil Fadnis
Nikhil Fadnis

Reputation: 797

I dont see a case keyword for your esac.. im sorry if i am misreading it..i am on mobile 🤗

The case ... esac statement syntax is as below :

case word in
   pattern1)
      # Statement(s) to be executed if pattern1 matches
      ;;
   pattern2)
      # Statement(s) to be executed if pattern2 matches
      ;;
   pattern3)
      # Statement(s) to be executed if pattern3 matches
      ;;
esac

Upvotes: 1

that other guy
that other guy

Reputation: 123490

There are 3 major issues:

  • Your case statement is missing a case keyword.
  • Your factorial function is missing a space before the ] in the while loop condition.
  • Your menu clears the screen every time it's shown, so it erases the output you ask for.

Here's the script with these issues highlighted and fixed:

#! /bin/bash

adauga() {
    printf "Introduceti un numar"
    read numar1
    printf "Introduceti alt numar"
    read numar2
    more
    let suma=$numar1+$numar2
    printf "$numar1 + $numar2 = $suma"
}
factorial () {
    n=0
    nr=0
    fact=1
    echo -n "Introduceti numarul: n= "  
    read n
    more 
    nr=$n   
    while [ $n -ge 1 ]  # Added space here
    do
        fact=`expr $fact \* $n`
        n=`expr $n - 1`
    done    
    echo "Factorialul numarului $nr este $fact"
}

conversie () {
    n=0
    hex=0
    echo -n "Introduceti numarul in baza 10: n= "   
    read n  
    hex=`echo "obase=16;ibase=10; $n" | bc`
    echo "$n in baza 10 este echivalent cu \"$hex\" in baza 16"
    return
}

while :
do
    # Removed 'clear' here to avoid clearing output
    echo " meniu"
    echo "1. Adunarea a 2 numere"
    echo "2. Determinarea factorialului unui numar"
    echo "3. Convertirea unui umar din baza 10 in aza 16"
    echo "4. Exit"
    echo -n "introduceti una din optiunile [1 - 4]"
    read opt
    case $opt in    # Added 'case' here
      1) adauga ;;
      2) factorial;;
      3) conversie;;
      4) echo "La revedere $USER";
         exit 1;;
      *) echo "$opt este o optiune invalida.";
         echo "Tasteaza enter pentru a continua .";
         read enterKey;;
    esac
done

Upvotes: 1

Related Questions