2008-12-16 4 views
4

J'ai un problème avec un script bash. Je dois utiliser l'opérateur * pour multiplier. Au lieu de cela, le script me dérange avec l'expansion et utilise comme opérateur le nom du script lui-même. J'ai essayé avec des guillemets simples mais il ne fonctionne pas :(Voici le codeÉviter l'expansion de * dans bash fonction intégrée let

#!/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 "[email protected]" 
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 

Répondre

6

Si « op » est « * », il sera étendu par le shell avant votre script ne voit même pas. Vous devez choisir autre chose pour votre opérateur de multiplication, comme "x", ou forcer vos utilisateurs à y échapper en le mettant entre guillemets simples ou en le précédant d'un antislash

Si les termes de l'exercice le permettent, vous devriez peut-être essayer d'utiliser "read" pour obtenir l'expression de l'entrée standard au lieu de les obtenir depuis la ligne de commande

+0

Il pourrait être une bonne idée, mais je dois rendre les utilisateurs à utiliser * au lieu des formes échappées .. :(Parce qu'un but de cet exercice est d'utiliser * – gc5

2

Cela fonctionne, vous n'échappez pas au * correctement. Essayez d'utiliser la barre oblique inverse:

$ ./calcola.scr 2 \* 3 
+ '[' 3 -lt 3 ']' 
+ result=0 
+ op=+ 
+ j=0 
+ for i in '"[email protected]"' 
+ '[' 0 -eq 0 ']' 
+ let result+=2 
+ j=1 
+ for i in '"[email protected]"' 
+ '[' 1 -eq 0 ']' 
+ op='*' 
+ j=0 
+ for i in '"[email protected]"' 
+ '[' 0 -eq 0 ']' 
+ let 'result*=3' 
+ j=1 
+ echo 'Result is 6' 
Result is 6 
+ exit 0 
$ 

Bien que, comme Paul Tomblin mentioned, il serait probablement préférable d'utiliser x comme l'opérateur de multiplication au lieu.

+0

Oui le code fonctionne avec échappé * .. Je ne sais pas .. Peut-être que le problème est dans la demande de l'exercice.Btw merci. :) – gc5

8

Si vous n'avez pas besoin de "* expansion" (appelé "globbing" en général) pour votre script, commencez par "-f"; vous pouvez également changer au cours de l'exécution:

[email protected]:/tmp/test$ echo * 
A B 
[email protected]:/tmp/test$ set -f 
[email protected]:/tmp/test$ echo * 
* 
[email protected]:/tmp/test$ set +f 
[email protected]:/tmp/test$ echo * 
A B 
+0

J'ai essayé de l'utiliser dans le script, mais ça ne fonctionne pas .. :(It est parce que la commande 'set -f' doit être appelée avant l'exécution du script Je ne peux pas éviter l'expansion car c'est fait quand le script commence. – gc5

Questions connexes