Deja tus scripts bash perfectos con ShellCheck

[h]ShellCheck[/h]
https://www.wifi-libre.com/img/members/3/shellcheck_5.jpg
Antes de todo un saludo amistoso a nuestro amigo del espacio V1sitor quién me ha hecho conocer shellcheck.
Es un script relativamente reciente, de 2014, y que me hubiera venido como un guante en la mano cuando empecé a interesarme a bash.
Nunca es tarde para tomar buenas costumbres.
¡Te invito a usar shellcheck ya!
Bash, como todo tipo de lenguaje, evoluciona
Las ordenes y las sintaxis cambian.
Esto puede provocar errores que pueden “romper” el script.
Estos errores se notan enseguida ya que tenemos un “fail” de primera y el script se parra en modo “error” indicando la linea incriminada:
https://www.wifi-libre.com/img/members/3/shellcheck_1.jpg
Hay otros tipos de errores que no se ven.
El script funciona sin que se nota nada.
Pero están allí y pueden provocar raras tipo “buffer overflow” y provocar de vez en cuando unos crash del script muy difíciles de corregir (apuntarán al script y a bash en el log de error)

Lo has entendido: Shellcheck es un script que tiene la gran virtud de repasar nuestros scripts y apuntar a todos estos pequeños detalles que podrían generar problemas.
Y puedo decir mirando los códigos bash que circulan en nuestro mundillo (incluyendo los dos o tres míos) que haría falta une buena sesión intensiva de shellcheck a tod@s :lol:
Es normal: Si por ejemplo con las versiones antiguas de bash se usaba “seq” y que funciona, pues, lo sigues usando si no te enteras de que esta “abandonado”

[h]Instalando y probando shellcheck [/h]

Esta disponible desde los repositorios de varias distribuciones.
Para las distribuciones basadas en debian (Kali, Ubuntu etc…)

sudo apt-get install shellcheck

La sintaxis es muy simple y hay muy pocas opciones
https://www.wifi-libre.com/img/members/3/shellcheck_2.jpg
Analizo el script en el cuál he puesto un error de sintaxis para provocar un error.
La salida es mucho más completa que la salida error estándar en consola (ver primera captura del tema)
Se sugieren repuestas y pistas.
https://www.wifi-libre.com/img/members/3/shellcheck_3.jpg
Lo que he hecho es añadir un " para romper el código.
Tengo aquí muchos elementos para ver lo y entenderlo

Quito el error voluntario y ahora analizo el código que se ejecuta perfectamente y sin errores.
https://www.wifi-libre.com/img/members/3/shellcheck_4.jpg
Podéis ver que se usa un código de color para clasificar los errores.
Mi error rojo no se ve ejecutando el código, el bucle rula y cumple su función.
Nunca me hubiera enterrado…

Voy a darle un buen repaso a este código y dejarlo niquelado… ¡Gracias shellcheck!
[list=*]
]ShellCheck by Koalaman @ GitHub/]
[/list]

Muy bueno ! :slight_smile:

He probado con hostbase y me ha salido esas 2 cosas:

^-- SC1035: You are missing a required space after the !. ^-- SC2046: Quote this to prevent word splitting.

Trabajar con eso ayuda mucho pienso :cool:

a final no deja ser como un debug de errores de sistexi en el propio codigo para bash la verdad es una buena herramienta para proposito de depuracion en el codigo.

@ Koala
¿Solo dos?
¡Te felicito! :slight_smile:
Mi script de 80 lineas tenía una docena de advertencias con dos naranjas y una roja… :smiley:
Y tengo los mismos errores que tu… En una sola linea :smiley:
Es muy bueno para quitarse malos hábitos y actualizar su sintaxis para estar bien en fase con bash.

Quiero décir 2 en rojo :cool: pero tengo pero en verde cosas como asi

C2006: Use $(..) instead of legacy `..`. ^-- SC2086: Double quote to prevent globbing and word spl ^-- SC2086: Double quote to prevent globbing and word splitting

Esto es realmente secundario… es poner siempre las variables entre “”
Lo hago de costumbre solo cuando es necesario.
Esto dicho siguiendo las indicaciones verdes hay mejoras simpáticas que no hubiera encontrado solo
Por ejemplo esta linea :

STRING=$(printf '%07d\n' $(($CONVERTEDBSSID%10000000)))  

quedó así

STRING=$(printf '%07d\n' $((CONVERTEDBSSID%10000000)))

No pensé en que no era necesario el “$” cuando usamos variables que tienen por valor un numero entero en una operación matemática.
Detalles así, no muy importantes, pero que nos ayudan a progresar.

A mi tambien habia echo la misma cosa tambien, poniendo el “$” a muchas veces… pero como dices ayuda a apprender de manera limpia :slight_smile:

No se si sera igual de efectivo , pero hay version web.

https://www.shellcheck.net/

Si, es igual en versión web que en versión programa :wink:
La versión web esta sincronizada con los repositorios Git Hub, siempre se usa la ultima revisión en corso. :

[quote][h]On the web[/h]

Paste a shell script on http://www.shellcheck.net for instant feedback.

ShellCheck.net is always synchronized to the latest git commit, and is the simplest way to give ShellCheck a go. Tell your friends![/quote]

salu2
tengo una pregunta
una cosa el script con el que empeze linsetgui y siguo aprendiendo estaba echo con zenity pero me da un error pero se ejecuta bien

Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged.
Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged.
Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged.
Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged.

pero se ejecuta bien pero da eso en consola

pero shellcheck no soy capaz de intalarlo o ejecutarlo me gustaria jugar mas con el ;por lo que se ve debe ser linea por linea de comando a verificar en la web
¿te da opciones de o pistas de codigo a insertar en caso de fallo ¿
podrias explicar un poquito mas eso de buscar errores es que lo que tu hiciste sabias donde estaba roto ;yo no o otro usuario que lo use
¿o solo te dice la linea donde falla el codigo ;porque eso ya lo hace de serie mi sistema¿

Hola dynyly :cool:

No conosco linset y con que gui esta hecho y no se si has visto la tema de Kcdtv pero esa error parece normal:

transforma-muy-facilmente-tu-script-bash-en-una-gui-con-zenity

Te da al principio tres colores verde, naranja y rojo que te da la importancia del error, por seguro tienes que ver mas verde que naranja o rojo.Te da la linea donde hay que hacer cambios y te da una indicacion por donde esta el problemo

^-- SC1035: You are missing a required space after the !.

Ahora lo que te queda a hacer es ir a la linea y cambiar la cosa :slight_smile:

Koala se me ha adelantado :smiley:
Para completar su respuesta:

Si no nos explicas los pasos que sigues y no nos enseñas los mensajes de errores que tienes al compilar/instalar no podremos decirte nada. :wink:
En la web me parece que puedes pasar un script entero: No tienes que hacer lo linea por linea.

salu2
gracias por responder pos no soy capaz no me digas no ostante ya cuando hay errores avisa la consola de fallo y la linea pero me gustaria juagar con shellcheck

sencillamente :

wifislax ~ # git clone https://github.com/koalaman/shellcheck Cloning into 'shellcheck'... remote: Counting objects: 3180, done. remote: Total 3180 (delta 0), reused 0 (delta 0), pack-reused 3180 Receiving objects: 100% (3180/3180), 2.36 MiB | 98.00 KiB/s, done. Resolving deltas: 100% (1924/1924), done. Checking connectivity... done..

wifislax ~ # sudo slapt-get --install /root/shellcheck Leyendo listas de paquetes...No se pudo abrir package_data package_data: No existe el fichero o el directorio ¿Tal vez quiera ejecutar --update?.

[code]wifislax ~ # sudo slapt-get --update shellcheck
Recuperando los datos del paquete [ftp://ftp.slackware.com/pub/slackware/slackware-current/]…Hecho
Recuperando la lista de parches [ftp://ftp.slackware.com/pub/slackware/slackware-current/]…Hecho
Recuperando la lista de checksum [ftp://ftp.slackware.com/pub/slackware/slackware-current/]…Hecho
Recuperando la firma de checksum [ftp://ftp.slackware.com/pub/slackware/slackware-current/]…Hecho
Verificando la firma de checksum [ftp://ftp.slackware.com/pub/slackware/slackware-current/]…No hay clave para verificar
Recuperando ChangeLog.txt [ftp://ftp.slackware.com/pub/slackware/slackware-current/]…Hecho

termino de actualizar

sudo slapt-get --install shellcheck
Leyendo listas de paquetes…Hecho
No existe el paquete: shellcheck.[/code]

wifislax shellcheck # ls Dockerfile README.md ShellCheck.cabal quicktest stack.yaml Dockerfile_builder Setup.hs doc shellcheck.1.md test LICENSE ShellCheck quickrun shellcheck.hs wifislax shellcheck # cd ShellCheck wifislax ShellCheck # shellcheck --help bash: shellcheck: no se encontró la orden.

No has entendido de qué va shellcheck… Se trata justamente de enseñarte todos los errores que no ves en consola.
Estos errores que no “rompen” el código pero que están allí (y pueden provocar bugs muy difíciles de detectar)
En esta captura:

Todos estos “errores” me salen comprobando un script que funciona perfectamente, sin ninguno error en consola, el script hace exactamente lo que se le pide.
La gran mayoría son de color verde: detalles.
Cosas que se pueden mejorar en el código.
Cosas que no puedes ver si nadie con conocimiento no está aquí para enseñarlas.

Sobre tu instalación.
Lo que haces no tiene sentido :slight_smile:
slapget son unos repositorios (pobres): No te hace falta bajar la rama de GitHub si usas los repositorios,
El ordenador ni va a mirrar lo que has descargado desde GitHub, va a pedir el paquete directo a tus repositorios (que no lo tienen.)
Mirra las instrucciones:
Caso uno: Desde repositorios

[quote]On systems with Cabal (installs to ~/.cabal/bin):

cabal update cabal install ShellCheck
On Debian based distros:

apt-get install shellcheck

On Gentoo based distros:

emerge --ask shellcheck

On Fedora based distros:

dnf install ShellCheck

On OS X with homebrew:

brew install shellcheck

On OS X with MacPorts:

port install shellcheck

On openSUSE:Tumbleweed:

zypper in ShellCheck

On other openSUSE distributions:
add OBS devel:languages:haskell repository from https://build.opensuse.org/project/repositories/devel:languages:haskell
zypper ar http://download.opensuse.org/repositories/devel:/languages:/haskell/openSUSE_$(version)/devel:languages:haskell.repo
zypper in ShellCheck
[/quote]
Puedes hacerlo así en muchos sistemas (Ubuntu, debian, Kali, backbox etc…) pero no en el tuyo (slackware con orden slapget)

Así que debes compilar y instalar tu el programa con la rama GitHub que acabas de descargas.

[quote]Compiling from** source**

This section describes how to build ShellCheck from a source directory. ShellCheck is written in Haskell and requires 2GB of RAM to compile.
Installing Cabal
ShellCheck is built and packaged using Cabal. Install the package cabal-install from your system’s package manager (with e.g. apt-get, yum, zypper or brew).
On MacPorts, the package is instead called hs-cabal-install, while native Windows users should install the latest version of the Haskell platform from https://www.haskell.org/platform/
Verify that cabal is installed and update its dependency list with

sudo cabal update

Compiling ShellCheck

git clone this repository, and cd to the ShellCheck source directory to build/install:

$ cabal install

This will compile ShellCheck and install it to your **~/.cabal/bin **directory.
Add this directory to your PATH (for bash, add this to your ~/.bashrc):

export PATH="$HOME/.cabal/bin:$PATH"

Log out and in again, and verify that your PATH is set up correctly:

$ which shellcheck ~/.cabal/bin/shellcheck
[/quote]
Instalas primero cabal (es probable que no lo tengas en tus repositorios tampoco con lo cuál tendrás que instalarlo tu mismo)
Luego sigues las instrucciones para compilar: shellcheck

salu2
gracias por tu paciencia amigo nunca me cansare de recordalo
que aun asi me sale linea en fallo era porque ya estaba quemado y como diciendo bueno a una mala tengo aviso en consola al no poder con shellcheck
pero ya sabia eso de los colores y que te dice errores que no salen a veces tan facilmente gracias de nuevo por recordarmelo
Uso slapt-get porque estoy con slakware pues wifislax es deribado de tal pero tambien gslapt y slpkg
perdona no se que es cabal gracias pero se necesita 2 gb de ram estoy en live como dices al tener instalado voy capao algo

Pero lo que si me interesa es como instalar lo que uno quiera en su sistema asi al menos se aprende algo mas

te sera pagado con el buen recuerdo amigo pues pocas cosas ahi mejor que recordar lo bueno de la persona y sus aportes
como dices en tus post cuando seas viejo ¿que les diras? a los nuevos
:D:D:D:D

Creo que el esfuerzo no compensa , ya que ademas esta la version web , …que simplemente pegas el code de tu script y te marca los errores o mejoras.

Si aun quieres instalarlo , el proceso te va a requerir de muchos recursos, ya que hay que instalar haskell y dependencias, al no exirtir paquetes ya compilados tienes que compilarlos tu , como hay “prebuilds” , en slackbuilds.org , es mas facil.

slapt-src -u slapt-src -i haskell-cabal-install slapt-src -i haskell-json slapt-src -i haskell-regex-tdfa slapt-src -i haskell-QuickCheck

pero , por ejemplo ,compilar GHC , es una locura en un equipo medio , y esa esta entre los paquetes que necesitas para ejecutar shellcheck.

EDIT: Mira lo que dice las instrucciones para ghc

https://slackbuilds.org/repository/14.2/haskell/ghc/

You will need 4.3G of free space in /tmp/SBo to build this package.

osea que necesitas 4 gigas para compilar simplemente ghc , ademas es un paquete “duro” … tardara mucho en compilar.

Creo que esta todo dicho , y para no desviar el hilo mas , en slackware o derivados , lo teneis jodido :slight_smile:

sencillamente gracias no quiero ser troll ni nada parecido pero tengo que agradecer comentarios ; de grandes con conocimiento explicando con paciencia grandes