2010-10-15 5 views
1

Я написал сценарий оболочки с футляром с кодом и принимает варианты 1-5 и выполняет операции с переменными соответственно.Shell Scripting. Логическая ОШИБКА

Мой код работает отлично, хотя это небольшое изменение, которое я хотел бы внести в свой код.

Когда код Входит в аргумент аргумента по умолчанию, после этого он по-прежнему запрашивает «Ввести два номера:», а затем печатает «Недопустимый параметр», который является неприемлемым. При этом код должен останавливаться после недопустимой опции.

Я только что узнал 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 

Я попытался использовать, если, еще ..., но это не служит цели. * Альтернативный подход: *

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

ответ

1

Вы должны смотреть на select встроенных команд, это поможет уменьшить сложность того, что вы хотите, довольно много. Вы можете заменить его эхо/случай.

В этом случае, я думаю, ваша проблема в том, что у вас есть ваши случаи как 1.), а не 1). Ваш пользователь должен будет ввести номер с период для первого, чтобы соответствовать.

Кроме того, вам необходимо иметь свою линию shebang как #!/bin/bash, это не сработает с пространством, которое у вас там есть.

+0

Спасибо, что я попробую выбрать и отредактировать периоды :) ... +1. Строка shebang отлично работает с пространством. – Pavitar

0

Если у вас есть такое меню, вы можете использовать бесконечный цикл.

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

Следует ли избегать использования $ [..]? или это неправильно? Я спрашиваю об этом, потому что я использовал $ [..], и он отлично работает. Поясните. – Pavitar

+0

нет, его не так. просто, что я привык к стилю C, который я забыл, мы можем использовать квадратные скобки. – ghostdog74

+0

@ ghostdog74 - ок спасибо .. :) – Pavitar

0

Вам не нужно использовать, если иное. Просто возьмите входной сигнал в корпусе переключателя.

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