Como eu uso argumentos de linha de comando no bash?

3

Este script move todos os arquivos doc para um diretório especificado. Eu consegui colocar um argumento, mas o problema que estou enfrentando é colocar o caminho completo para onde os scripts estão se movendo, por exemplo, eu quero executar o script como este abaixo

./loo -d then path where im moving the files (i.e ./loo -d the second argument where files are moving to)

este é o meu código

#!/bin/bash
From="/home/elg19/lone/doc"
To="/home/elg19/documents"

if [  = -d ]; then
cd "$From"
for i in pdf txt doc; do
  find . -type f -name "*.${i}" -exec mv "{}" "$To" \;
done
fi
    
por kickev 18.12.2011 / 11:33

3 respostas

3

Você precisa de getopts. getopts é uma biblioteca projetada para manipular argumentos de linha de comando para você e está geralmente disponível em vários idiomas. No bash, você usa assim:

Isso é emprestado de um tutorial que encontrei :

From="/home/elg19/lone/doc"
To="/home/elg19/documents"

while getopts "d:" optionName; do
    case "$optionName" in
        d) To="$OPTARG";;
        [?]) exit 255;;
    esac
done

[[ -d "$To" ]] || exit 255

cd "$From"
for i in pdf txt doc; do
    find . -type f -name "*.${i}" -exec mv "{}" "$To" \;
done

Isso não foi testado, mas basicamente é apenas o seu script com a opção de substituir o argumento "$ To" por getopts.

O bit [?] diz para sair se alguma opção não reconhecida for encontrada.

    
por Caesium 18.12.2011 / 11:47
2

FWIW, o rsync fará isso por você

rsync --filter="+ *.doc" --filter="+ *.pdf" --filter="+ *.txt" --filter="- *" ~lone/doc/* ~/documents/

Você pode criar um alias em .bashrc se desejar

alias backup='rsync --filter="+ *.doc" --filter="+ *.pdf" --filter="+ *.txt" --filter="- *" ~lone/doc/* ~/documents/'

Se você precisar de mais do que * .doc, adicione ao --filer="+ * .txt";)

Veja meu comentário se você quiser depurar seu script. Seu problema no seu script pode ser tão simples quanto seu condicional if [ = -d ]

tente

if [ -d "" ]; then

Mas não posso dizer pelo seu script quais opções você está passando e por quê (você definiu seus diretórios em seu script).

    
por Panther 18.12.2011 / 19:43
1

Com seu comentário mais recente

#!/bin/bash

From="/home/elg19/lone/doc"
#To="/home/elg19/documents"

while getopts "d:" optionName; do
    case "$optionName" in
        d) To="$OPTARG";;
        [?]) exit 255;;
    esac
done

[[ -d "$To" ]] || exit 255

for i in pdf txt doc; do
    find $From -type f -name "*.${i}" -exec mv "{}" "$To" \;
done
    
por Panther 18.12.2011 / 20:31

Tags