2016-02-02 3 views
1

Итак, я исправил свою первую проблему с помощью ввода сценария, но теперь, независимо от того, в какую букву я вхожу, он только добавляет числа.При запуске скрипта 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

«нет никакой возможности для ввода». Неясно, что вы имеете в виду, вы понимаете, что ваш скрипт можно назвать «myscript a 3 4»? Это ваш ввод, иначе вам нужно добавить 'read x?". Введите x значение «' и т. Д. Где-нибудь в вашем скрипте. Кроме того, 'elif' будет лучше для ваших вторых тестов. Еще лучше использовать 'case $ op в a) add ... ;; ....; esac' и т. д. Лучше уточнить свой текст Q, чем отвечать на комментарии. Удачи. – shellter

+0

Спасибо. Я изменил из 2 методов добавления ввода на полпути и все запутался. – Bradg89

ответ

2

Первый всего, вы хотите, чтобы сценарий к read the values from the standard input, но вы восстанавливаете его из аргументов.

Второй, вы не передаете параметры функции.

В-третьих,, вы не используете параметры внутри функций.

Четвертого, вы не давая пространства между операторами при использовании выража.

ПРИМЕЧАНИЕ: Rany Albeg Wein отметил, что этот bash guide устарел, и он рекомендует this one. Также я рекомендую GNU official guide (other 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 в начале скрипта.

+3

Руководство tldp Bash устарело, а в некоторых случаях просто неправильно. Хотя это частично может быть правильным, рекомендуется избегать его использования, особенно в качестве начинающего. Я рекомендую использовать этот [Bash Guide] (http://mywiki.wooledge.org/BashGuide) вместо :-) –

+0

Спасибо, Рани, я отредактировал ответ и добавил примечание. Ссылки теперь перенаправляют руководство, которое вы рекомендуете. Также я добавил официальную ссылку GNU Bash. –

+0

Отлично! Спасибо :-) –

3

Похоже, вы хотите получить х и у из первого и второго аргументов ($1 и $2) и читать операции (a, s, d, м) из стандартного ввода. Я изменил код немного, чтобы преодолеть проблемы в первоначальном сценарии и обеспечить результат на основе моих предположений:

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

PS

Пожалуйста, обратите внимание на следующее:

  • expr это программа, используемая в древнем коде оболочки, чтобы сделать математику. В оболочках POSIX, таких как bash, используйте $((expression)). В bash, ksh88 +, mksh/pdksh или zsh вы также можете использовать ((expression)) или 'let выражение'.
  • Несмотря на то, что в скрипте не используется оригинально, при программировании в Bash стоит знать, что [[ является ключевым словом bash, аналогичным (но более мощным, чем) командой [. См. Это Bash FAQ и Test and conditionals. Если вы не пишете POSIX sh, рекомендуется использовать [[.
Смежные вопросы