2017-02-11 5 views
0

Я пытаюсь написать сценарий калькулятора, но первый if блокирует elif. Я имею в виду, когда я пытаюсь запустить его, я нажимаю 1, но он работает так, как будто я нажал 2. Вот мой код.Bash if blocking elif

echo "For Advanced mode press 1" 
echo "For Help press 2" 

loop=1 
while [ $loop=1 ]; do 

    read n 

    if [ $n=2 ]; then 
      echo "To use the calculator follow the promptings." 
      echo "If asked, the operators are: " 
      echo "* for multiplication,/for division." 
      echo "+ for addition, - for subtraction." 
      echo "% for modulus, which is division remainder" 
      echo "== is equal to, != is not equal to." 
      echo "** for exponents" 
      n="" 

    elif [ $n=1 ]; then 
      read a 
      break 
    fi 

done 
echo "_______________________" 
echo "What would you like to do?" 
echo "Press 1 for basic arith" 
echo -n "Press 2 for geometry" 
read choice 
loop=2 

if [ $choice=1]; then 
    while [ $loop=2 ]; do 
     echo -n "Enter X Value: " 
     read x 
    echo -n "Enter Operator: " 
    read op 
    echo -n "Enter Y Value: " 
    read y 
    ans=$((x $op y)) 
    echo "$x $op $y = $ans" 
    echo "____________________" 
    echo "To input a new function, press enter" 
    read cont 
    done 
fi 

ответ

0

Помещенных пространства между вашим состоянием элементами, как $n = 2 не $n=2 .ВЫ должны передать его аргументы как пробельные слова, разделенными. Так что ваш код должен быть следующим:

echo "For Advanced mode press 1" 
echo "For Help press 2" 

loop=1 
while [ $loop = 1 ]; do 

    read n 

    if [ $n = 2 ]; then 
     echo "To use the calculator follow the promptings." 
     echo "If asked, the operators are: " 
     echo "* for multiplication,/for division." 
     echo "+ for addition, - for subtraction." 
     echo "% for modulus, which is division remainder" 
     echo "== is equal to, != is not equal to." 
     echo "** for exponents" 
     n="" 

    elif [ $n = 1 ]; then 
     read a 
     break 
    fi 

done 
echo "_______________________" 
echo "What would you like to do?" 
echo "Press 1 for basic arith" 
echo -n "Press 2 for geometry" 
read choice 
loop=2 

if [ $choice = 1 ]; then 
    while [ $loop = 2 ]; do 
     echo -n "Enter X Value: " 
     read x 
    echo -n "Enter Operator: " 
    read op 
    echo -n "Enter Y Value: " 
    read y 
    ans=$((x $op y)) 
    echo "$x $op $y = $ans" 
    echo "____________________" 
    echo "To input a new function, press enter" 
    read cont 
    done 
fi 
3

[ встроенных используются для оценки условий. Должно быть пробел после открытия [ и пробел перед закрытием ], в противном случае это неправильный синтаксис.

Внутри выражения [ ... ] вы можете использовать различные условные операторы. Одним из таких операторов является =. Вы должны помещать пробелы до и после оператора, иначе он не будет признан оператором.

Например, [ $n=2 ], где значение n равно 1, будет оцениваться как [ 1=2 ]. 1=2 не оценивается как условие, потому что вокруг него нет пробелов. Значение 1=2 будет оцениваться как строка «1 = 2». И любая непустая строка в Bash равна правша, поэтому утверждение [ 1=2 ] дает true, даже если оно не выглядит «похоже», это было бы правдой.

Вы должны написать [ "$n" = 2 ], так что = интерпретируется как условный оператор, и выражение не становится одной строкой. Обратите внимание, что пробелы чрезвычайно важны в Bash. Пространства, разделяющие логические элементы программы, без пространственных выражений объединяются как строки.

Также обратите внимание, что я добавил двойные кавычки вокруг переменной. Это необходимо для защиты выражения в случае, если переменная пуста. Если, например, вы пишете [ $n = 2 ], а переменная пуста, то выражение будет оцениваться как [ = 2 ], что является искаженным выражением, и скрипт будет сбой с ошибкой.

+0

Хороший ответ. '[' подсчитывает количество аргументов, которые оно задано, и делает разные вещи на основе этого числа. Также обратите внимание, что встроенный bash '[[' более разумен в отношении некотируемых переменных (они заменяются пустой строкой, поэтому они не «теряют место» в качестве аргумента). –