【问题标题】:Shell Scripting. Logical ERROR外壳脚本。逻辑错误
【发布时间】:2011-04-26 03:14:32
【问题描述】:

我编写了一个带有 switch case 的 shell 脚本,并采用了选项 1-5 并对变量进行了相应的操作。

我的代码运行良好,但我想对我的代码进行一些小改动。

当代码输入默认case参数后,仍然提示“输入两个数字:”,然后打印“无效选项”,这是不合适的。理想情况下,代码应该在无效选项后停止。

我刚刚学习了 shell 脚本,所以我不太擅长。

我在下面复制粘贴了我的源代码:

#! /bin/bash

echo "1. Add
        2.Substract
    3.Divide
    4.Multiply
    5.Quit"

read -p "Enter an option:" option
read -p "Enter two numbes: " first second

case $option in

1)income=$[ first + second ];;
2)income=$[ first - second ];;
3)income=$[ first / second ];;
4)income=$[ first * second ];;
*)echo "Invalid Option";
    exit 1;;

esac

echo "Income=$income"

exit 0

我尝试使用 if,else ...但这并没有达到目的。 *替代方法:*

#! /bin/bash                                                                                                                                                                                                                                                                       

echo "1. Add
        2.Substract
    3.Divide
    4.Multiply
    5.Quit"

read -p "Enter an option:" option

if [ option > 5 ]
then 

    echo "Invalid Option"
        exit 1

else 

read -p "Enter two numbes: " first second

fi

case $option in

1)income=$[ first + second ];;
2)income=$[ first - second ];;
3)income=$[ first / second ];;
4)income=$[ first * second ];;
*)echo "Invalid Option";
    exit 1;;

esac

echo "Income=$income"

exit 0

【问题讨论】:

    标签: bash unix shell


    【解决方案1】:

    您应该查看select 内置函数,它将大大降低您想要的东西的复杂性。您可以用它替换 echo/case。

    在这种情况下,我认为您的问题是您的案例为1.) 而不是1)。您的用户需要键入数字和,以便前者匹配。

    此外,您需要将 shebang 行设为#!/bin/bash,它不适用于您那里的空间。

    【讨论】:

    • 谢谢,好的,我会尝试选择并编辑句点:) ... +1。 shebang 线也适用于空间。
    【解决方案2】:

    当您有这样的菜单时,您可以使用无限循环。

    #! /bin/bash
    
    
    while true
    do
    cat <<-EOF
      1. Add
      2.Substract
      3.Divide
      4.Multiply
      5.Quit
    EOF
        read -p "Enter an option:" option
        read -p "Enter two numbes: " first second
    
        case $option in
        1) income=$((first + second ));;
        2) income=$(( first - second ));;
        3) income=$(( first / second ));;
        4) income=$(( first * second ));;
        5) exit;;
        *) echo "Invalid Option, try again";
        esac
    
        echo "Income=$income"
    done
    

    【讨论】:

    • 是不是应该避免使用$[..]?还是错了?我问这个是因为我使用过 $[..] 并且效果很好。请解释一下。
    • 不,没有错。只是我习惯了 C 风格,我忘了我们也可以使用方括号。
    • 这个答案仍然没有解决我的问题。在我点击退出后,它不应该再次询问这两个数字,而只是打印一条错误消息并退出程序..
    • 然后把read -p "Enter two numbes: " first second放在case/esac之后
    【解决方案3】:

    你不需要使用 if else。只需在开关盒中输入即可。

    #!/bin/bash
    
    echo "
          1.Add
          2.Subtract
          3.Divide
          4.Multiply
          5.Quit"
    
    read -p "Enter an option:" option
    
    case $option in
    
    1)
        read -p "Enter two numbers " first second
        income=$[ first + second ];;
    
    2)
        read -p "Enter two numbers " first second
        income=$[ first - second ];;
    
    
    3)
        read -p "Enter two numbers " first second
        income=$[ first / second ];;
    
    4)
        read -p "Enter two functions " first second
        income=$[ first * second ];;
    
    *)echo "Invalid Option";
        exit 1;;
    
    esac
    
    echo "Income = $income"
    
    exit 0
    

    或者你可以使用函数来避免重复读取语句。

    #!/bin/bash
    
    function GetInput()
    {
        read -p "Enter two numbers : " first second
    }
    
    
    
    echo "
          1.Add
          2.Substract
          3.Divide
          4.Multiply
          5.Quit"
    
    read -p "Enter an option:" option
    
    case $option in
    
    1)
        GetInput
        income=$[ first + second ];;
    
    2)
        GetInput
        income=$[ first - second ];;
    
    
    3)
        GetInput
        income=$[ first / second ];;
    
    4)
        GetInput
        income=$[ first * second ];;
    
    *)echo "Invalid Option";
        exit 1;;
    
    esac
    
    echo "Income = $income"
    
    exit 0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-08
      • 2014-01-14
      • 1970-01-01
      • 1970-01-01
      • 2013-08-05
      • 2012-01-31
      • 1970-01-01
      相关资源
      最近更新 更多