Verifique se um script bash tem exatamente dois argumentos que são diretórios

Verifique se um script bash tem exatamente dois argumentos que são diretórios

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 utilidadediffcompara dois arquivos. Com a opção -r, compara diretórios recursivamente.

diff -ru -- "$1" "$2"

informação relacionada