Eu criei um básico para ajudar a automatizar o processo de remoção de várias pastas à medida que se tornam desnecessárias.
#!/bin/bash
rm -rf ~/myfolder1/$1/anotherfolder
rm -rf ~/myfolder2/$1/yetanotherfolder
rm -rf ~/myfolder3/$1/thisisafolder
Isso é evocado assim:
./myscript.sh <{id-number}>
O problema é que, se você se esquecer de digitar id-number
(como acabei de fazer) , isso poderá potencialmente excluir muitas coisas que você realmente não deseja excluir.
Existe uma maneira de adicionar qualquer forma de validação aos parâmetros da linha de comando? No meu caso, seria bom verificar se a) existe um parâmetro, b) é numérico ec) essa pasta existe; antes de continuar com o script.
fonte
A
sh
solução porBrian Campbell
, embora nobre e bem executada, tem alguns problemas, então pensei em fornecer minha própriabash
solução.Os problemas com
sh
aquele:~/foo
não se expande para seu diretório de origem dentro de heredocs. E nem quando é lido pelaread
declaração ou citado narm
declaração. O que significa que você obteráNo such file or directory
erros.grep
e coisas assim para operações básicas é uma tolice. Especialmente quando você está usando uma casca de baixa qualidade para evitar o peso "pesado" do bash.echo
.sh
pode lidar com eles - e é por isso que quase sempre prefirobash
, é muito mais à prova de balas e mais difícil de explorar quando bem usado).Embora, sim, usar
/bin/sh
para o seu hashbang signifique que você deve evitarbash
ismos a todo custo, você pode usar todos osbash
ismos que quiser, mesmo no Ubuntu ou qualquer outra coisa, quando for honesto e colocar#!/bin/bash
no topo.Portanto, aqui está uma
bash
solução que é menor, mais limpa, mais transparente, provavelmente "mais rápida" e mais à prova de balas.$1
norm
declaração!-d
verificação também falhará se$1
estiver vazia, ou seja, duas verificações em uma.=~
no bash, deve colocar a expressão regular em uma variável. Em qualquer caso, globs como o meu são sempre preferíveis e suportados em muito mais versões do bash.fonte
$1 != *[^0-9]*
bash da peça globbing é específico?Eu usaria o bash's
[[
:Achei este faq uma boa fonte de informação.
fonte
Não tão à prova de balas quanto a resposta acima, porém ainda eficaz:
fonte
Use o
set -u
que fará com que qualquer referência de argumento não definida falhe imediatamente no script.Por favor, veja o artigo: Escrevendo Scripts Robust Bash Shell - David Pashley.com .
fonte
A página man para test (
man test
) fornece todos os operadores disponíveis que você pode usar como operadores booleanos no bash. Use esses sinalizadores no início do seu script (ou funções) para validação de entrada, assim como você faria em qualquer outra linguagem de programação. Por exemplo:fonte
Use '-z' para testar strings vazias e '-d para verificar diretórios.
fonte
Você pode validar os pontos aeb compactamente fazendo algo como o seguinte:
O que nos dá ...
Este método deve funcionar bem em sh.
fonte
validação de argumento de um liner Bash, com e sem validação de diretório
Aqui estão alguns métodos que funcionaram para mim. Você pode usá-los no namespace de script global (se estiver no namespace global, você não pode fazer referência às variáveis internas da função)
um forro rápido e sujo
resultado:
Fancier - fornece o nome da função e uso
resultado:
Adicione lógica de validação complexa sem bagunçar sua função atual
Adicione a seguinte linha na função ou script que recebe o argumento.
Você pode então criar uma função de validação que faz algo como
e uma função die que aborta o script em caso de falha
Para argumentos adicionais, basta adicionar uma linha adicional, replicando o formato.
fonte
Postagem antiga, mas achei que poderia contribuir de qualquer maneira.
Um script sem dúvida não é necessário e com alguma tolerância a curingas pode ser executado a partir da linha de comando.
selvagem em qualquer lugar correspondente. Vamos remover qualquer ocorrência da sub "pasta"
Shell iterado. Vamos remover as pastas específicas pré e pós com uma linha
Shell iterado + var (testado em BASH).
fonte