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 "$@"
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
4

3 回答 3

8

如果您的脚本根本不需要“* 扩展”(通常称为“通配符”),只需以“-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
于 2008-12-22T18:39:24.773 回答
6

如果 "op" 是 "*",它会在你的脚本看到它之前被 shell 扩展。您需要为乘法运算符选择其他内容,例如“x”,或者通过将其放在单引号中或在其前面加上反斜杠来强制用户对其进行转义。

如果练习的条件允许,也许您应该尝试使用“read”从标准输入中获取表达式,而不是从命令行获取它们。

于 2008-12-16T21:35:45.143 回答
2

它有效,你只是没有*正确地逃避。尝试使用反斜杠:

$ ./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
$

虽然,正如 Paul Tomblin提到x的,使用乘法运算符可能会更好。

于 2008-12-16T21:43:59.290 回答