首页 > 解决方案 > bash 脚本。有没有办法缩短我的代码?

问题描述

这是一个计算器代码,它可以为您提供文字结果。我使用了很多 if 条件。我打算用最多 30 的数字来做。有没有办法缩短它?

#! bin/bash

    while true; do

    read -p "First number: " n1
        read -p "Second number: " n2
        PS3="what's the operation? "
        select ans in add subtract multiply divide; do
            case $ans in
                add) op='+' ; break ;;
                subtract) op='-' ; break ;;
                multiply) op='*' ; break ;;
                divide) op='/' ; break ;;
                *) echo "invalid response" ;;
            esac
        done
        ans=$(echo "$n1 $op $n2" | bc -l)
        if [ $ans == 1 ] ; then
         printf "%s %s %s = one \n\n" "$n1" "$op" "$n2"
        elif [ $ans == 2 ] ; then 
       printf "%s %s %s = two \n\n" "$n1" "$op" "$n2";
     elif [ $ans == 3 ] ; then 
       printf "%s %s %s = three \n\n" "$n1" "$op" "$n2";
     elif [ $ans == 4 ] ; then 
       printf "%s %s %s = four \n\n" "$n1" "$op" "$n2";
     elif [ $ans == 5 ] ; then 
       printf "%s %s %s = five \n\n" "$n1" "$op" "$n2";
     elif [ $ans == 6 ] ; then 
       printf "%s %s %s = six \n\n" "$n1" "$op" "$n2";
     elif [ $ans == 7] ; then 
       printf "%s %s %s = seven \n\n" "$n1" "$op" "$n2";
     elif [ $ans == 8] ; then 
       printf "%s %s %s = eight \n\n" "$n1" "$op" "$n2";
     elif [ $ans == 9] ; then 
       printf "%s %s %s = nine \n\n" "$n1" "$op" "$n2";
     elif [ $ans == 10] ; then 
       printf "%s %s %s = ten \n\n" "$n1" "$op" "$n2";
        fi

标签: bashshell

解决方案


您可以使用数组:

#!/bin/bash

while true; do

  read -p "First number: " n1
  read -p "Second number: " n2
  PS3="what's the operation? "
  select ans in add subtract multiply divide; do
      case $ans in
          add) op='+' ; break ;;
          subtract) op='-' ; break ;;
          multiply) op='*' ; break ;;
          divide) op='/' ; break ;;
          *) echo "invalid response" ;;
      esac
  done
  ans=$(echo "$n1 $op $n2" | bc -l)
  res=(zero one two three four five six seven eight nine ten eleven)
  printf "%s %s %s = ${res[ans]} \n\n" "$n1" "$op" "$n2"
done

由于原始代码没有显示错误检查,因此我也将其省略(作为练习,像往常一样)。


推荐阅读