Domanda

Ho un problema con uno script bash. Devo usare l'operatore * a multiplicate. Invece i sceneggiatura mi bug con l'espansione e utilizzando come operatore il nome dello script stesso. Ho provato con virgolette singole, ma non funziona :( Ecco il codice

#!/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
È stato utile?

Soluzione

Se "op" è "*", che sarà ampliato dalla shell prima che lo script vede addirittura. È necessario scegliere qualcosa di diverso per il vostro operatore di moltiplicazione, come "x", o imporre agli utenti di sfuggire esso mettendolo tra virgolette singole o precede con un backslash.

Se le condizioni di esercizio lo permettono, forse si dovrebbe provare a utilizzare "leggere" per ottenere l'espressione dallo standard input invece di ottenere dalla riga di comando.

Altri suggerimenti

Se non è necessario "* espansione" (denominato come "globbing" in generale) a tutti per lo script, basta iniziare con "-f"; si può anche cambiare durante la fase di esecuzione:

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

Funziona, non sei solo sfuggire alla * correttamente. Provare a utilizzare la barra inversa:

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

Anche se, come Paul Tomblin menzionato , probabilmente sarebbe meglio usare x come l'operatore di moltiplicazione al posto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top