Ayuda con script SHELL

Imagen de fabuloso_p
0 puntos

Hola COmpas.

Estoy haciendo un curso de Linux y estoy algo complicado con unos scripts que tengo que hacer. lo que necesito es que el script me diga cuales números del 1 al 20 son cuadrados o potencias, es decir, el 1, 4, 9 y 16, debe decir que es cuadrado.

Hasta el momento lo logro, con el siguiente procedimiento, ingreso los números, luego le saco la raíz cuadrada y le resto el entero de la raíz, con lo que los números que son cuadrados dan =0 mientras los demás queda en residuo en decimales.

el problema esta ahi, ya que la terminal me muestra que se esperaba un número entero y nose como solucionarlo. he intentado realizar la condición con AWK, pero me dice que se esperaba un operador unario. ya no se que hacer....ojala me puedan ayudar y guiar.

el script es el siguiente:

#! /bin/bash

#imprimir numeros de 1 a 20
for x in {1..20}
do

num=`echo $x | awk '{print sqrt($1) - int(sqrt($1))}'`

if [ $num -eq 0 ]
then
num=si
else
num=no
fi

echo $x $num

done

este es el resultado al hacerlo correr:

1 si
./script.sh: línea 9: [: 0.414214: se esperaba una expresión entera
2 no
./script.sh: línea 9: [: 0.732051: se esperaba una expresión entera
3 no
4 si
./script.sh: línea 9: [: 0.236068: se esperaba una expresión entera
5 no
./script.sh: línea 9: [: 0.44949: se esperaba una expresión entera
6 no
./script.sh: línea 9: [: 0.645751: se esperaba una expresión entera
7 no
./script.sh: línea 9: [: 0.828427: se esperaba una expresión entera
8 no
9 si
./script.sh: línea 9: [: 0.162278: se esperaba una expresión entera
10 no
./script.sh: línea 9: [: 0.316625: se esperaba una expresión entera
11 no
./script.sh: línea 9: [: 0.464102: se esperaba una expresión entera
12 no
./script.sh: línea 9: [: 0.605551: se esperaba una expresión entera
13 no
./script.sh: línea 9: [: 0.741657: se esperaba una expresión entera
14 no
./script.sh: línea 9: [: 0.872983: se esperaba una expresión entera
15 no
16 si
./script.sh: línea 9: [: 0.123106: se esperaba una expresión entera
17 no
./script.sh: línea 9: [: 0.242641: se esperaba una expresión entera
18 no
./script.sh: línea 9: [: 0.358899: se esperaba una expresión entera
19 no
./script.sh: línea 9: [: 0.472136: se esperaba una expresión entera
20 no

como ven, me logra decir cuando un numero es cuadrado, pero cuando no, me tira el error de que espera una expresión entera.

ojala me puedan ayudar que ya me tiene muy complicado ese problema.

SAludos!

Pedro

Imagen de joseluis
+1
0
-1

A no ser que tengas que utilizar awk por alguna imposición yo utilizaría bc para sacar la raiz cuadrada:

raiz=`echo "sqrt($x)" | bc`

Eso te dará la raiz cuadrada truncada (únicamente te da la parte entera), pero te puede servir si luego comparas su cuadrado $((${raiz}*${raiz})) con el numero $x ya que coincidirán cuando es un cuadrado perfecto.

+1
0
-1

Fdo. Forense asesino, Censor fundamentalista, Fustigador de novatos y Patético maleducado

Imagen de joseluis
+1
0
-1

Acabo de ver el problema que realmente tienes con tu script. De hecho el mensaje de error que te da es suficientemente explicativo. Te está diciendo que en la comparación del if esperaba una expresión entera, y al ser un número decimal lo está tomando como un alfanumérico. Como lo único que te interesa es saber si es 0 o no es 0 lo único que tienes que hacer es compararlo como alfanuméricos y no como números, es decir en lugar de utilizar -eq en el if utiliza =

   if [ $num = 0 ]
+1
0
-1

Fdo. Forense asesino, Censor fundamentalista, Fustigador de novatos y Patético maleducado

Imagen de fabuloso_p
+1
0
-1

Muchas gracias por la ayuda compa.....el script solo con esa modificación funciona perfecto...era solo ese detalle que me faltaba...muchas gracias por la ayuda porque ya me tenia loco el script, mucho tiempo pensando en el problema......

Saludos y gracias denuevo!

+1
0
-1

de cada cual segun sus capacidades, a cada quien segun sus necesidades.