Se me ocurrió uno básico para ayudar a automatizar el proceso de eliminación de varias carpetas a medida que se vuelven innecesarias.
#!/bin/bash
rm -rf ~/myfolder1/$1/anotherfolder
rm -rf ~/myfolder2/$1/yetanotherfolder
rm -rf ~/myfolder3/$1/thisisafolder
Esto se evoca así:
./myscript.sh <{id-number}>
El problema es que si te olvidas de escribir id-number (como hice en ese momento) , podría eliminar muchas cosas que realmente no quieres que se eliminen.
¿Hay alguna manera de agregar alguna forma de validación a los parámetros de la línea de comando? En mi caso, sería bueno comprobar que a) hay un parámetro, b) es numérico yc) esa carpeta existe; antes de continuar con el guión.
fuente

La
shsolución deBrian Campbell, aunque noble y bien ejecutada, tiene algunos problemas, así que pensé en proporcionar mi propiabashsolución.Los problemas con el
shuno:~/foono se expande a su directorio principal dentro de heredocs. Y tampoco cuando se lee en lareaddeclaración o se cita en larmdeclaración. Lo que significa que obtendráNo such file or directoryerrores.grepy cosas así para operaciones básicas es una tontería. Especialmente cuando estás usando un caparazón de mierda para evitar el peso "pesado" de bash.echo.shpuede hacerles frente, por lo que casi siempre prefierobash, es mucho más a prueba de balas y más difícil de explotar cuando se usa bien).Si bien, sí, usar
/bin/shpara su hashbang significa que debe evitar losbashismos a toda costa, puede usar todos losbashismos que desee, incluso en Ubuntu o cualquier otra cosa cuando sea honesto y esté#!/bin/bashen la cima.Entonces, aquí hay una
bashsolución que es más pequeña, más limpia, más transparente, probablemente "más rápida" y más a prueba de balas.$1en larmdeclaración!-dverificación también fallará si$1está vacía, por lo que son dos verificaciones en una.=~en bash, debe poner la expresión regular en una variable. En cualquier caso, los globs como el mío son siempre preferibles y compatibles con muchas más versiones de bash.fuente
$1 != *[^0-9]*bash es específica?Yo usaría bash's
[[:Encontré que estas preguntas frecuentes son una buena fuente de información.
fuente
No tan a prueba de balas como la respuesta anterior, pero sigue siendo eficaz:
fuente
Use
set -uque hará que cualquier referencia de argumento no establecida falle inmediatamente en el script.Por favor, consulte el artículo: Escritura de scripts sólidos de Bash Shell - David Pashley.com .
fuente
La página de manual de test (
man test) proporciona todos los operadores disponibles que puede usar como operadores booleanos en bash. Use esos indicadores al comienzo de su script (o funciones) para la validación de entrada como lo haría en cualquier otro lenguaje de programación. Por ejemplo:fuente
Use '-z' para probar cadenas vacías y '-d para verificar directorios.
fuente
Puede validar los puntos ayb de forma compacta haciendo algo como lo siguiente:
Lo que nos da ...
Este método debería funcionar bien en sh.
fuente
validación de un argumento de línea Bash, con y sin validación de directorio
Aquí hay algunos métodos que me han funcionado. Puede usarlos en el espacio de nombres de script global (si está en el espacio de nombres global, no puede hacer referencia a las variables integradas de la función)
un forro rápido y sucio
salida:
Fancier: nombre y uso de la función de suministro
salida:
Agregue una lógica de validación compleja sin saturar su función actual
Agregue la siguiente línea dentro de la función o secuencia de comandos que recibe el argumento.
Luego puede crear una función de validación que haga algo como
y una función de troquel que aborta el script en caso de falla
Para argumentos adicionales, simplemente agregue una línea adicional, replicando el formato.
fuente
Publicación antigua, pero pensé que podría contribuir de todos modos.
Podría decirse que un script no es necesario y, con cierta tolerancia a los comodines, se podría ejecutar desde la línea de comandos.
salvaje en cualquier lugar que coincida. Eliminemos cualquier aparición de sub "carpeta"
Shell repitió. Eliminemos las carpetas previas y posteriores específicas con una línea
Shell iterado + var (probado en BASH).
fuente