script decimals arithmetic bash scripting expansion let

decimals - Evite la expansión de*en la función Bash incorporada dejada



if bash (3)

Tengo un problema con un script bash. Tengo que usar el operador * para multiplicar. En cambio, el script me molesta con la expansión y usa como operador el nombre del script en sí. Intenté con comillas simples pero no funciona :( Aquí está el 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


Si "op" es "*", se expandirá por el shell antes de que el script lo vea. Debe elegir algo más para su operador de multiplicación, como "x", o forzar a los usuarios a que lo salten poniéndolo entre comillas simples o precediéndolo con una barra invertida.

Si los términos del ejercicio lo permiten, tal vez debería intentar usar "leer" para obtener la expresión de la entrada estándar en lugar de obtenerla desde la línea de comando.


Si no necesita "* expansión" (referida como "globbing" en general) para su script, simplemente comience con "-f"; también puedes cambiarlo durante el tiempo de ejecución:

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


Funciona, simplemente no estás escapando * correctamente. Intenta usar la barra diagonal 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 $

Aunque, como mencionó Paul Tomblin, probablemente sería mejor usar x como el operador de multiplicación.