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

5

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 digitar 1 arg em vez de 2 (precisamos de 2, pois estamos comparando dois diretórios), isso deve dar um erro. Se os dois argumentos forem válidos, compare os diretórios e a saída para um arquivo.

    
por asura 15.10.2014 / 04:33

2 respostas

6

Processando argumentos

O processamento de argumentos que são passados através da linha de comando de um script é tão simples como a seguir. Digamos que tenhamos esse 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 & 2, são diretórios válidos ou não, e então salvam ou prosseguem conforme necessário. Então nós introduzimos 2 verificações para ver se os 2 argumentos são diretórios ou não, se não, então 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 que não seja 2 diretórios, o script simplesmente sairá.

$ ./cmd.bash hi bye

Se tivermos dois diretórios:

$ ./cmd.bash d1 d2
arg1: d1
arg2: d2

Se recebermos mais de dois argumentos:

$ ./cmd.bash d1 d2 d3

Deixarei a comparação dos dois diretórios para você. Para aprender Bash, eu diria para o link abaixo para um livro on-line gratuito sobre Bash.

Referências

por 15.10.2014 / 05:17
2

O número de argumentos está no parâmetro $# .

if [ $# -ne 2 ]; then
  echo 1>&2 "Usage: $0 DIRECTORY1 DIRECTORY2"
  exit 3
fi

Se você quiser impor que os argumentos sejam ambos diretórios (em oposição a outros tipos de arquivos), teste-os com -d .

O utilitário diff compara dois arquivos. Com a opção -r , compara os diretórios recursivamente.

diff -ru -- "$1" "$2"
    
por 16.10.2014 / 02:08