Избегайте расширения * встроенной функции bash, позволяющей
Вопрос
У меня проблема со скриптом 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
вместо этого в качестве оператора умножения.