Estoy aprendiendo a escribir en Shell para un diploma en TI que estoy haciendo actualmente. Estoy tratando de escribir un pequeño script que agregue dos números como se muestra en uno de los tutoriales que nos dieron.
echo "Enter two numbers" read num1 num2 sum = "expr $num1 + $num2" echo "The sum is = $sum"
Sin embargo, cuando le doy el permiso de ejecución y ejecutar el script, me da este error.
sum: =. No such file or directory. sum: expr $num1 + $num2: No such file or directory
Intenté ejecutar esto tanto en Ubuntu como en Fedora, pero se produce el mismo error. ¿Alguien puede decirme lo que «me estoy perdiendo aquí?
Comentarios
- Relacionado: unix.stackexchange.com/questions/40786/…
Respuesta
Primero debe deshacerse de los espacios para la tarea, por ejemplo
sum="expr $num1 + $num2"
entonces tienes que cambiar "
a `
o incluso mejor a $()
:
sum=$(expr "$num1" + "$num2")
en lugar de usar expr
también puedes hacer el cálculo ulación directamente en su shell:
sum=$((num1 + num2))
Comentarios
Respuesta
Probablemente haya leído mal las comillas inversas como comillas simples en la línea:
sum = "expr $num1 + $num2"
Consulte la Wiki de Greg sobre el uso de $(...)
en su lugar.
Este funciona como se esperaba:
sum=$(expr "$num1" + "$num2")
También tenga en cuenta que no hay espacios alrededor del signo igual (la asignación de la variable).
Respuesta
expr
es un programa externo utilizado por Bourne shell (es decir sh). El shell Bourne no tenía originalmente ningún mecanismo para realizar operaciones aritméticas simples. Utiliza expr
un programa externo con la ayuda de comillas inversas.
Las comillas inversas ( `) en realidad se llama sustitución de comando. La sustitución de comando es el mecanismo por el cual el shell ejecuta un conjunto de comandos dado y luego sustituye su salida en el lugar de los comandos.
sum=`expr $num1 + $num2`
En bash (bourne again shell) tiene la siguiente systax, no usará el programa externo expr
.
sum=$((num1+num2))
si queremos utilizar el programa externo expr
. tenemos la siguiente systax:
sum=$(expr $num1 + $num2)
expr
en lugar de$((...))
es un deseo de ser portátil al shell Bourne clásico, entonces ' es una buena idea para evitar$(...)
también.$()
? Hasta donde yo sé, posix lo requiere, p. Ej. todos los shells compatibles con Posix deben admitir$()
$(…)
, pero casi se ha extinguido (tal vez alguien en algún lugar todavía esté ejecutando/bin/sh
en Solaris).$(…)
–– o al menos, no todas las versiones.