Избегайте расширения * в встроенной функции bash - PullRequest
4 голосов
/ 17 декабря 2008

У меня проблема со скриптом 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

Ответы [ 3 ]

8 голосов
/ 22 декабря 2008

Если вам вообще не нужен "* extension" (в целом называемый "globbing") для вашего скрипта, просто запустите его с "-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
6 голосов
/ 17 декабря 2008

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

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

2 голосов
/ 17 декабря 2008

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

$ ./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 в качестве оператора умножения.

...