运行bash脚本时出现逻辑错误

时间:2016-02-02 03:53:19

标签: bash

所以我已经修改了我的第一个问题,脚本输入但现在无论我输入什么字母,它只添加数字。

这是代码。任何帮助将不胜感激。

#!/bin/bash

add() {
        expr $x + $y
}

sub() {
        expr $x - $y
}

mult() {
        expr $x * $y
}

div() {
        expr $x / $y
}

 echo "Enter a for add, s for subtract, m for multiply or d for divide and 2 numbers"
read choice x y

 if [ $choice=="a" ]
 then
         add
 else
        if [ $choice == "s" ]
        then
                sub
        else
                if [ $choice == "m" ]
                then
                        mult
                else
                        if [ $choice == "d" ]
                        then
                                div

                        fi
                fi
        fi
fi

2 个答案:

答案 0 :(得分:3)

您似乎希望从第一个和第二个参数($1$2)获取 x y 并阅读操作来自stdin的( a,s,d,m )。 我稍微修改了你的代码,以克服原始脚本中的问题,并根据我的假设提供结果:

#!/bin/bash

# First number.
x=$1
# Second number.
y=$2
# Result of either addition, subtraction, division or multiplication of     $x and $y.
result=0

# Reads operation from user.
read -ep "Enter a for add, s for subtract, m for multiply or d for divide: " operation

case $operation in
    a) result=$(( x + y ));;
    s) result=$(( x - y ));;
    d) result=$(( x / y ));;
    m) result=$(( x * y ));;
    *) printf '%s: %s\n' "$operation" "Unknown operation" >&2; exit 1;;
esac

printf 'result: %s\n' "$result"

用法示例:(脚本名称为 sof.sh

./sof.sh 5 4
Enter a for add, s for subtract, m for multiply or d for divide: a
result: 9

./sof.sh 5 4
Enter a for add, s for subtract, m for multiply or d for divide: m
result: 20

./sof.sh 5 4
Enter a for add, s for subtract, m for multiply or d for divide: s
result: 1

./sof.sh 5 4
Enter a for add, s for subtract, m for multiply or d for divide: d
result: 1

<强> P.S。

请注意以下事项:

  • expr是古代shell代码中用来进行数学运算的程序。在像bash这样的POSIX shell中,使用$(( expression ))。在bash,ksh88 +,mksh / pdksh或zsh中,您还可以使用(( expression ))或'let             表达”。
  • 虽然最初没有在脚本中使用,但在使用Bash进行编程时,值得知道[[是一个类似于[命令(但功能更强大)的bash关键字。见Bash FAQTest and conditionals。 除非您是为POSIX sh编写的,否则建议使用[[

答案 1 :(得分:2)

首先,您希望脚本为read the values from the standard input,但您正在从参数中恢复它。

第二个,您没有将参数传递给函数。

第三个​​,你没有在函数中使用参数。

第四,在使用 expr 时,您不会在运算符之间留出空格。

注意 Rany Albeg Wein 注意到此bash guide已过时,他建议this one。我还推荐GNU official guideother formats)。

因此,假设您要使用像./my-script.sh m 2 3 这样的脚本,这是您的代码,但正在运行:

#!/bin/bash                                                                                                                                                                           

add() {                                                                            
    expr $1 + $2                                                                   
}                                                                                  

sub() {                                                                            
    expr $1 - $2                                                                   
}                                                                                  

mult() {                                                                           
    expr $1 \* $2                                                                  
}                                                                                  

div() {                                                                            
    expr $1 / $2                                                                   
}                                                                               

echo "Enter a for add, s for subtract, m for multiply or d for divide and 2 numbers"
x=$2                                                                            
y=$3                                                                            

if [ $1 == "a" ]                                                                
then                                                                            
    add $x $y                                                                   
else                                                                            
    if [ $1 == "s" ]                                                            
    then                                                                        
        sub $x $y                                                               
    else                                                                        
        if [ $1 == "m" ]                                                        
        then                                                                    
            mult $x $y                                                          
        else                                                                    
            if [ $1 == "d" ]                                                    
            then                                                                
                div $x $y                                                       
            fi                                                                  
        fi                                                                      
    fi                                                                          
fi 

最后,这是您的脚本最低限度修改为read the data from the standard input

#!/bin/bash                                                                     

add() {                                                                         
    echo "Result:"                                                                                                                                                                    
    expr $1 + $2                                                                
}                                                                               

sub() {                                                                         
    echo "Result:"                                                              
    expr $1 - $2                                                                
}                                                                               

mult() {                                                                        
    echo "Result:"                                                              
    expr $1 \* $2                                                               
}                                                                               

div() {                                                                         
    echo "Result:"                                                              
    expr $1 / $2                                                                
}                                                                               

echo "Enter a for add, s for subtract, m for multiply or d for divide and 2 numbers"
read operation                                                                  
echo "Read first parameter"                                                     
read x                                                                          
echo "Read second parameter"                                                    
read y                                                                          

if [ $operation == "a" ]                                                        
then                                                                            
    add $x $y                                                                   
else                                                                            
    if [ $operation == "s" ]                                                    
    then                                                                        
        sub $x $y                                                               
    else                                                                        
        if [ $operation == "m" ]                                                
        then                                                                    
            mult $x $y                                                          
        else                                                                    
            if [ $operation == "d" ]                                            
            then                                                                
                div $x $y                                                       
            fi                                                                  
        fi                                                                      
    fi     
fi

此外,如果您遇到麻烦,可以在脚本的开头设置#!/bin/bash -xv的脚本中添加调试消息。