2008-12-16 100 views
4

我有一个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 "[email protected]" 
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 

回答

6

如果“OP”是“*”,它将由外壳脚本,甚至看到它之前扩大。你需要选择如乘号运算符的其他内容,例如“x”,或者强制用户将其放在单引号中,或用反斜线将它转义。

如果练习的条款允许,也许您应该尝试使用“读”来获得从标准输入表达式,而不是通过命令行让他们的。

+0

这可能是一个好主意,但我必须做出用户使用*而不是逃脱形式.. :(因为这个练习的目标是使用* – gc5 2008-12-16 21:42:17

2

它的工作原理,你只是没有逃脱*正确。尝试使用反斜线:

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

虽然,正如保罗汤布林mentioned,它可能会更好地使用x作为乘法运算符。

+0

是的代码工作与逃脱* ..我不知道..也许问题是在演习的请求。顺便说一句谢谢。:) – gc5 2008-12-16 21:51:06

8

如果您不需要“*扩展”(以下简称一般的“通配”)在所有的脚本,只需用“-f”启动;你也可以在运行时改变它:

[email protected]:/tmp/test$ echo * 
A B 
[email protected]:/tmp/test$ set -f 
[email protected]:/tmp/test$ echo * 
* 
[email protected]:/tmp/test$ set +f 
[email protected]:/tmp/test$ echo * 
A B 
+0

我试图在脚本中使用它,但它不工作.. :(这是因为命令“设置” -f有脚本的运行之前被调用。我无法避免的扩展,因为脚本时,启动完成。 – gc5 2008-12-28 15:08:58

相关问题