Estoy escribiendo un script bash que compara dos directorios, pero no estoy seguro de cómo verificar las condiciones.
Por ejemplo, si el usuario ingresa 1 arg en lugar de 2 (necesitamos 2 ya que estamos comparando dos directorios), debería dar un error. Si ambos argumentos son válidos, compare los directorios y la salida a un archivo.
Respuesta1
Procesamiento de argumentos
Procesar argumentos que se pasan a través de la línea de comando de un script es tan simple como se muestra a continuación. Digamos que teníamos este script:
$ cat cmd.bash
#!/bin/bash
echo "arg1: $1"
echo "arg2: $2"
Ahora ejecuta sin argumentos:
$ ./cmd.bash
arg1:
arg2:
Con 1 argumento:
$ ./cmd.bash hi
arg1: hi
arg2:
Con 2 argumentos:
$ ./cmd.bash hi bye
arg1: hi
arg2: bye
Comprobando los argumentos
Luego puede verificar si los argumentos 1 y 2 son directorios válidos o no, y luego salir o continuar según sea necesario. Entonces introducimos 2 comprobaciones para ver si los 2 argumentos son directorios o no; si no, salimos.
$ cat cmd.bash
#!/bin/bash
[ -d "$1" ] || exit
[ -d "$2" ] || exit
[ $# == 2 ] || exit
echo "arg1: $1"
echo "arg2: $2"
Ejemplo
Digamos que tenemos estos directorios.
$ mkdir d1 d2
$ ls -l
total 12
-rwxrwxr-x. 1 saml saml 89 Oct 14 23:13 cmd.bash
drwxrwxr-x. 2 saml saml 4096 Oct 14 23:14 d1
drwxrwxr-x. 2 saml saml 4096 Oct 14 23:14 d2
Si se nos proporciona algo más que 2 directorios, el script simplemente se cerrará.
$ ./cmd.bash hi bye
Si nos dan 2 directorios:
$ ./cmd.bash d1 d2
arg1: d1
arg2: d2
Si nos dan más de 2 argumentos:
$ ./cmd.bash d1 d2 d3
Te dejo la comparación de los 2 directorios. Para aprender Bash, lo dirigiría al siguiente enlace para obtener un libro en línea gratuito sobre Bash.
Referencias
Respuesta2
El número de argumentos está en elparámetro$#
.
if [ $# -ne 2 ]; then
echo 1>&2 "Usage: $0 DIRECTORY1 DIRECTORY2"
exit 3
fi
Si desea imponer que los argumentos sean ambos directorios (a diferencia de otros tipos de archivos), pruébelos con-d
.
La utilidaddiff
compara dos archivos. Con la opción -r
compara directorios de forma recursiva.
diff -ru -- "$1" "$2"