为什么我的函数没有在case语句中完全执行?

时间:2017-05-22 20:39:34

标签: linux shell unix

我和一个新手一样多,而且必须完成我的第一个大任务。不幸的是,我迷路了。谁能告诉我我做错了什么?显示菜单case语句,然后显示函数中的echo,但它不会被执行,然后跳回菜单。谢谢!

#! /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

2 个答案:

答案 0 :(得分:1)

我没有看到你的esac的案例关键字..我很抱歉,如果我误读它..我在移动设备

案例... esac语句语法如下:

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

答案 1 :(得分:1)

有三个主要问题:

  • 您的个案陈述缺少case个关键字。
  • 您的阶乘函数在while循环条件中的]之前缺少空格。
  • 您的菜单会在每次显示时清除屏幕,因此会删除您要求的输出。

以下是突出显示并修复了这些问题的脚本:

#! /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