Estou escrevendo um script bash que compara dois diretórios, mas não sei como verificar as condições
Por exemplo, se o usuário inserir 1 argumento em vez de 2 (precisamos de 2, pois estamos comparando dois diretórios), deverá ocorrer um erro. Se ambos os argumentos forem válidos, compare os diretórios e a saída para um arquivo.
Responder1
Processando argumentos
O processamento de argumentos passados por meio da linha de comando de um script é tão simples quanto a seguir. Digamos que tivéssemos este script:
$ cat cmd.bash
#!/bin/bash
echo "arg1: $1"
echo "arg2: $2"
Agora execute sem argumentos:
$ ./cmd.bash
arg1:
arg2:
Com 1 argumento:
$ ./cmd.bash hi
arg1: hi
arg2:
Com 2 argumentos:
$ ./cmd.bash hi bye
arg1: hi
arg2: bye
Verificando os argumentos
Você pode então verificar se os argumentos 1 e 2 são diretórios válidos ou não e, em seguida, resgatar ou prosseguir conforme necessário. Portanto, introduzimos 2 verificações para ver se os 2 argumentos são diretórios ou não, caso contrário, saia.
$ cat cmd.bash
#!/bin/bash
[ -d "$1" ] || exit
[ -d "$2" ] || exit
[ $# == 2 ] || exit
echo "arg1: $1"
echo "arg2: $2"
Exemplo
Digamos que temos esses diretórios.
$ 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
Se recebermos algo diferente de 2 diretórios, o script simplesmente será encerrado.
$ ./cmd.bash hi bye
Se recebermos 2 diretórios:
$ ./cmd.bash d1 d2
arg1: d1
arg2: d2
Se recebermos mais de 2 argumentos:
$ ./cmd.bash d1 d2 d3
Vou deixar a comparação dos 2 diretórios para você. Para aprender Bash, direciono você para o link abaixo para um livro online gratuito sobre Bash.
Referências
Responder2
O número de argumentos está noparâmetro$#
.
if [ $# -ne 2 ]; then
echo 1>&2 "Usage: $0 DIRECTORY1 DIRECTORY2"
exit 3
fi
Se você quiser garantir que os argumentos sejam ambos diretórios (em oposição a outros tipos de arquivos), teste-os com-d
.
A utilidadediff
compara dois arquivos. Com a opção -r
, compara diretórios recursivamente.
diff -ru -- "$1" "$2"