Избегайте расширения * встроенной функции bash, позволяющей

StackOverflow https://stackoverflow.com/questions/372807

  •  21-08-2019
  •  | 
  •  

Вопрос

У меня проблема со скриптом bash.Я должен использовать оператор * для умножения.Вместо этого скрипт выводит меня из строя расширением и использованием в качестве оператора имени самого скрипта.Я пробовал использовать одинарные кавычки, но это не работает: ( Вот код

#!/bin/bash -x

# Bash script that calculates an arithmetic expression
# NO PRECEDENCE FOR OPERATORS
# Operators: + - * 

if [ "$#" -lt "3" ]
then 
    echo "Usage: ./calcola.scr <num> <op> <num> ..."
    exit 1
fi

result=0
op=+
j=0

for i in "$@"
do
    if [ "$j" -eq "0" ]
    then
        # first try
        #result=$(( $result $op $i )) 

        # second try
        let "result$op=$i"

        j=1
    else
        op=$i
        j=0
    fi
done

echo "Result is $result"

exit 0
Это было полезно?

Решение

Если "op" равен "*", он будет расширен оболочкой еще до того, как ваш скрипт его увидит.Вам нужно выбрать что-то другое для вашего оператора умножения, например "x", или заставить ваших пользователей избегать его, заключив в одинарные кавычки или предваряя обратной косой чертой.

Если условия упражнения позволяют это, возможно, вам следует попробовать использовать "read" для получения выражения из стандартного ввода вместо того, чтобы получать их из командной строки.

Другие советы

Если вам вообще не нужно "* expansion" (обычно называемое "глобализацией") для вашего скрипта, просто запустите его с "-f".;вы также можете изменить его во время выполнения:

mat@owiowi:/tmp/test$ echo *
A B
mat@owiowi:/tmp/test$ set -f
mat@owiowi:/tmp/test$ echo *
*
mat@owiowi:/tmp/test$ set +f
mat@owiowi:/tmp/test$ echo *
A B

Это работает, вы просто не избегаете * правильно.Попробуйте использовать обратную косую черту:

$ ./calcola.scr 2 \* 3
+ '[' 3 -lt 3 ']'
+ result=0
+ op=+
+ j=0
+ for i in '"$@"'
+ '[' 0 -eq 0 ']'
+ let result+=2
+ j=1
+ for i in '"$@"'
+ '[' 1 -eq 0 ']'
+ op='*'
+ j=0
+ for i in '"$@"'
+ '[' 0 -eq 0 ']'
+ let 'result*=3'
+ j=1
+ echo 'Result is 6'
Result is 6
+ exit 0
$

Хотя, как Пол Томблин упомянутый, вероятно , было бы лучше использовать x вместо этого в качестве оператора умножения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top