我有一个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”,或者强制用户通过将其在单引号或用反斜杠前述它逃脱它。

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

其他提示

如果您不需要“*扩展”(以下简称一般的“通配”)在所有的脚本,只需用“-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