Estoy tratando de usar Bash para completar el Proyecto Euler 13 . A continuación se muestra mi código que simplemente no puedo entender qué está mal.
#!/bin/bash
sum=0
while read -r -d $'\r' line; do
sum=$(echo $sum + $line | bc)
done <<< "$(curl -s http://pastebin.com/raw/uHZ0PZjm)"
echo "${sum:0:10}"
exit
Solía dar lugar a dos errores,
(standard_in) 1: syntax error
y
(standard_in) 1: illegal character: ^M
Después de algunas investigaciones, parecía ser un problema con los terminadores EOF. Luego ejecuté dos2unix en él y ya no da el segundo error, pero sigue dando el primero repetidamente. Parece haber algún problema con la forma en que estoy canalizando los datos en bc, pero no tengo idea de qué o cómo solucionarlo.
La respuesta correcta es 5537376230. ¡Muchas gracias por todo lo que pueda ayudar!
La información del sistema es
GNU bash, versión 4.3.11 (1) -release (x86_64-pc-linux-gnu)
Estoy usando cmder en Windows 10.
bash
shell-script
curl
bc
Egrodo
fuente
fuente
5483872696
...:-)
. Por cierto, solo es cuestión de unos segundos, realmente agregue el sistema operativo y la versión de su sistema. Todavía tengo curiosidad por saber la razón que causa lasyntax error
. Poner el código en un script en mi sistema no arroja ningún error ...Respuestas:
Desea establecer \ n (== 0x0a == LF == salto de línea) como su
read
delimitador, no\r
(== 0x0d == CR == retorno de carro). O eso, o asegúrese de poner un CR al final de su archivo pastebin. Parece que al archivo pastebin le falta una secuencia de terminación de línea al final de la última línea, por lo que la última línea nunca se alimenta a su script.Tenga en cuenta que hay un 0x0d0a (CR LF) entre cada número, pero no después del último.
Tenga en cuenta que el último número, 535 [...] 690, falta cuando se ejecuta a través de su
read
comando. Pero si cambia su delimitador al carácter de línea nueva LF (\ n) nativo de Unix, se incluye la última línea:Editado para agregar: Aquí hay una solución que maneja los CR en el archivo pastebin. Le dije
read
que usara CRLF como delimitador, y usé un eco adicional para agregar un CRLF después del archivo pastebin.fuente
bc
está asfixiando porque tu pastebin tiene CR's. Cuando probé mi cambio, lo probé con un planoecho
, sin conectarlobc
. En cuanto a su nuevo problema, el shell no conserva sus nuevas líneas en esa asignación de cadena, por lo que$numbers
termina siendo una línea larga con espacios entre los números.command <<< "string"
cosa se llama "cadena aquí", y es casi lo mismo que usarecho "string" | command
. En su caso, está utilizando$(curl… ; echo…)
para formar la "cadena aquí" a partir de la salida estándar decurl
, seguida de la salida estándar deecho
. En las secuencias de comandos de shell, un punto y coma separa los comandos, lo que le permite colocar varios comandos en una línea.Puedes hacerlo:
Que usa:
fuente