Wymyśliłem podstawowy, który pomaga zautomatyzować proces usuwania wielu folderów, gdy stają się niepotrzebne.
#!/bin/bash
rm -rf ~/myfolder1/$1/anotherfolder
rm -rf ~/myfolder2/$1/yetanotherfolder
rm -rf ~/myfolder3/$1/thisisafolder
Jest to wywołane w ten sposób:
./myscript.sh <{id-number}>
Problem polega na tym, że jeśli zapomnisz wpisać id-number
(tak jak wtedy zrobiłem) , może to potencjalnie usunąć wiele rzeczy, których naprawdę nie chcesz usunąć.
Czy istnieje sposób, aby dodać dowolną formę walidacji do parametrów wiersza poleceń? W moim przypadku dobrze byłoby sprawdzić, czy a) jest jeden parametr, b) jest numeryczny ic) czy folder istnieje; przed kontynuowaniem skryptu.
źródło
sh
Rozwiązanie przezBrian Campbell
, a szlachetny i dobrze wykonany, ma kilka problemów, więc pomyślałem, że zapewniają własnebash
rozwiązanie.Problemy z
sh
jednym:~/foo
nie rozwija się do katalogu głównego w heredocach. Ani wtedy, gdy jest czytane przezread
oświadczenie lub cytowane wrm
oświadczeniu. Co oznacza, że dostanieszNo such file or directory
błędy.grep
i takie podstawowe operacje są głupie. Zwłaszcza, gdy używasz kiepskiej muszli, aby uniknąć „ciężkiego” uderzenia.echo
.sh
może sobie z nimi poradzić - dlatego prawie zawsze wolębash
, jest znacznie bardziej kuloodporny i trudniejszy do wykorzystania, gdy jest dobrze używany).Chociaż tak, używanie
/bin/sh
do haszowania oznacza, że musisz unikaćbash
izmów za wszelką cenę, możesz używać wszystkichbash
izmów, które lubisz, nawet na Ubuntu lub czegokolwiek, jeśli jesteś uczciwy i szczery#!/bin/bash
na szczycie.Oto
bash
rozwiązanie, które jest mniejsze, czystsze, bardziej przejrzyste, prawdopodobnie „szybsze” i bardziej kuloodporne.[[ -d $1 && $1 != *[^0-9]* ]] || { echo "Invalid input." >&2; exit 1; } rm -rf ~/foo/"$1"/bar ...
$1
wrm
oświadczeniu!-d
Sprawdzić, czy nie będzie również$1
jest pusta, więc to dwie kontrole w jednym.=~
w bash, powinieneś umieścić wyrażenie regularne w zmiennej. W każdym razie, globy takie jak moja są zawsze preferowane i obsługiwane w znacznie większej liczbie wersji basha.źródło
$1 != *[^0-9]*
bash globbing piece jest specyficzny?Użyłbym basha
[[
:if [[ ! ("$#" == 1 && $1 =~ ^[0-9]+$ && -d $1) ]]; then echo 'Please pass a number that corresponds to a directory' exit 1 fi
Uznałem, że ten FAQ jest dobrym źródłem informacji.
źródło
Nie tak kuloodporny jak powyższa odpowiedź, ale nadal skuteczny:
#!/bin/bash if [ "$1" = "" ] then echo "Usage: $0 <id number to be cleaned up>" exit fi # rm commands go here
źródło
Użycie,
set -u
które spowoduje, że każde nieustawione odwołanie do argumentu natychmiast zakończy działanie skryptu.Zapoznaj się z artykułem: Writing Robust Bash Shell Scripts - David Pashley.com .
źródło
Strona man dla test (
man test
) zawiera wszystkie dostępne operatory, których możesz użyć jako operatorów logicznych w bash. Użyj tych flag na początku skryptu (lub funkcji) do sprawdzania poprawności danych wejściowych, tak jak w każdym innym języku programowania. Na przykład:if [ -z $1 ] ; then echo "First parameter needed!" && exit 1; fi if [ -z $2 ] ; then echo "Second parameter needed!" && exit 2; fi
źródło
Użyj „-z”, aby sprawdzić, czy nie ma pustych łańcuchów, i „-d”, aby sprawdzić katalogi.
if [[ -z "$@" ]]; then echo >&2 "You must supply an argument!" exit 1 elif [[ ! -d "$@" ]]; then echo >&2 "$@ is not a valid directory!" exit 1 fi
źródło
Możesz zwięźle sprawdzić poprawność punktów a i b, wykonując coś takiego:
#!/bin/sh MYVAL=$(echo ${1} | awk '/^[0-9]+$/') MYVAL=${MYVAL:?"Usage - testparms <number>"} echo ${MYVAL}
Co daje nam ...
Ta metoda powinna działać dobrze w sh.
źródło
walidacja argumentów Bash z jedną linijką, zi bez walidacji katalogu
Oto kilka metod, które zadziałały w moim przypadku. Możesz ich używać w globalnej przestrzeni nazw skryptu (jeśli w globalnej przestrzeni nazw nie możesz odwoływać się do zmiennych wbudowanych funkcji)
szybki i brudny jeden wkład
: ${1?' You forgot to supply a directory name'}
wynik:
Hodowca - nazwa i zastosowanie funkcji dostaw
${1? ERROR Function: ${FUNCNAME[0]}() Usage: " ${FUNCNAME[0]} directory_name"}
wynik:
Dodaj złożoną logikę walidacji bez zaśmiecania bieżącej funkcji
Dodaj następujący wiersz w funkcji lub skrypcie, który otrzymuje argument.
: ${1?'forgot to supply a directory name'} && validate $1 || die 'Please supply a valid directory'
Następnie możesz utworzyć funkcję walidacji, która robi coś podobnego
validate() { #validate input and & return 1 if failed, 0 if succeed if [[ ! -d "$1" ]]; then return 1 fi }
oraz funkcja matrycy, która przerywa skrypt w przypadku niepowodzenia
die() { echo "$*" 1>&2 ; exit 1; }
Aby uzyskać dodatkowe argumenty, po prostu dodaj dodatkową linię, replikując format.
: ${1?' You forgot to supply the first argument'} : ${2?' You forgot to supply the second argument'}
źródło
Stary post, ale pomyślałem, że i tak mógłbym wnieść swój wkład.
Skrypt prawdopodobnie nie jest konieczny iz pewną tolerancją dla symboli wieloznacznych mógłby zostać wykonany z wiersza poleceń.
dzikie dopasowanie wszędzie. Pozwala usunąć wszelkie wystąpienia pod „folderu”
Powłoka iterowana. Pozwala usunąć określone foldery pre i post za pomocą jednej linii
Powłoka iterowana + var (przetestowana przez BASH).
źródło