Frage

Ich habe ein Problem mit einem Bash-Skript. Ich habe den Betreiber * verwenden, um zu vervielfältigen. Stattdessen werden die Skript nervt mich mit Expansion und Verwendung als Betreiber den Namen des Skripts selbst. Ich habe versucht, mit einfachen Anführungszeichen, aber es funktioniert nicht :( Hier ist der Code ist

#!/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
War es hilfreich?

Lösung

Wenn „op“ ist „*“, wird er von der Shell erweitert werden, bevor das Skript es auch sieht. Sie müssen etwas anderes für Ihren Multiplikationsoperator wählen, wie „x“, oder die Benutzer zu zwingen, es zu entkommen, indem sie in einfachen Anführungszeichen setzen oder mit einem umgekehrten Schrägstrich vorangehenden.

Wenn die Bedingungen der Ausübung es erlauben, vielleicht sollten Sie versuchen, „lesen“, um den Ausdruck von der Standardeingabe verwenden, anstatt sie von der Kommandozeile zu bekommen.

Andere Tipps

Wenn Sie nicht brauchen „* Expansion“ (im Folgenden als „Platzhalter“ im Allgemeinen) überhaupt für Ihr Skript, starten Sie einfach mit „f“; Sie können auch während der Laufzeit ändern:

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

Es funktioniert, bist du einfach nicht die * richtig zu entkommen. Versuchen Sie es mit den umgekehrten Schrägstrich:

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

Obwohl, wie Paul Tomblin erwähnt , es wäre wahrscheinlich besser, verwenden x als der Multiplikationsoperator statt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top