Pergunta

Eu tenho um problema com um script bash. Eu tenho que usar o operador * para multiplicar. Em vez disso o script me incomoda com expansão e usando como operador o nome do script em si. Eu tentei com aspas simples, mas ele não funciona :( Aqui está o código

#!/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
Foi útil?

Solução

Se "op" é "*", ela será expandida pelo shell antes de seu script até mesmo vê-lo. Você precisa escolher outra coisa para o seu operador de multiplicação, como "x", ou forçar os usuários a escapar-lo, colocando-o entre aspas simples ou precedendo-o com uma barra invertida.

Se os termos do exercício permitir que ele, talvez você deve tentar usar "ler" para obter a expressão da entrada padrão, em vez de fazê-los a partir da linha de comando.

Outras dicas

Se você não precisa "* expansão" (referido como "globbing" em geral) em tudo para o seu script, basta começar com "-f"; você também pode alterá-lo durante o tempo de execução:

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

Ele funciona, você está simplesmente não fugir do * corretamente. Tente usar a barra invertida:

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

Embora, como Paul Tomblin mencionado , provavelmente seria melhor usar x como o operador de multiplicação vez.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top