Vermeiden Erweiterung von * in bash gebautet Funktion dient
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
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.