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
sh
solución deBrian Campbell
, aunque noble y bien ejecutada, tiene algunos problemas, así que pensé en proporcionar mi propiabash
solución.Los problemas con el
sh
uno:~/foo
no se expande a su directorio principal dentro de heredocs. Y tampoco cuando se lee en laread
declaración o se cita en larm
declaración. Lo que significa que obtendráNo such file or directory
errores.grep
y 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
.sh
puede 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/sh
para su hashbang significa que debe evitar losbash
ismos a toda costa, puede usar todos losbash
ismos que desee, incluso en Ubuntu o cualquier otra cosa cuando sea honesto y esté#!/bin/bash
en la cima.Entonces, aquí hay una
bash
solució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.$1
en larm
declaración!-d
verificación también fallará si$1
está 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 -u
que 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