Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Jakim poleceniem mogę policzyć liczbę wierszy w pliku tekstowym???
I jeszcze takie pytanko na uboczy do czego służy opcja OPTARG??
Offline
dawideo napisał(-a):
Jakim poleceniem mogę policzyć liczbę wierszy w pliku tekstowym???
wc -l liczy linie, może być z wejścia przez potok lub podajesz plik jako argument (ale wtedy brzydko podaje razem z nazwą pliku)
w perwersyjny sposób można też za pomocą cat -n plik | tail -1 | awk '{print $1}' ;)
dawideo napisał(-a):
I jeszcze takie pytanko na uboczy do czego służy opcja OPTARG??
poczytaj na uboczu o getopt
tak pokrótce na uboczu napiszę tylko, że służy do obrabiania podanych argumentów dla flag
Ostatnio edytowany przez azhag (2008-05-08 23:18:12)
Offline
Czy mógłby mi ktoś powiedzieć co mam w tym skrypcie nie tak???
if [ $# -eq 0 ]; then echo "Skrypt oblicza ilosc lini w pliku tekstowym" echo "-inazwapliku" elif [ $# -gt 3 ]; then echo "Nieprawidlowa liczba paramertow" else while getopts :i:j: par do case $par in i) if [ -r $OPTARG ]; then echo "W pliku jest: `cat -n $OPTARG | tail -1 | awk '{print $1}'` linii" echo "W pliku jest: `wc -w $OPTARG | awk '{print $1}'` slow" echo "W pliku jst: `wc -c $OPTARG | awk '{print $1}'` znakow" echo "Plik zajmuje: `ls -il | grep -w $OPTARG | awk '{printf $6}'` bajtów" fi;; j) lista=$(diff -s "$1" "$2" | grep ident | sed 's/.*\///;s/\ .*//') if [ -z "$lista" ]; then printf "\n Brak identycznych plików w podanych katalogach\n" else printf "\n--- Pliki identyczne ---\n" printf "\n$lista\n" printf "\n------- Koniec -------\n" fi exit $?;; ?) echo "Nieznana opcja."; exit;; esac done; fi
Tzn. Opcja "i" mi działa mam natomiast problem z opcją "j". Np. po wpisaniu:
./skrypt.sh -jetc nowy ; (gdzie etc i nowy to dwa katalogi w których skrypt ma znaleść dwa takie same pliki)
Wyskakuj błąd
diff: błędna opcja -- j diff: Napisz `diff --help' żeby dowiedzieć się więcej.
Offline
if [ $# -eq 0 ]; then echo "Skrypt oblicza ilosc lini w pliku tekstowym" echo "-inazwapliku" elif [ $# -gt 3 ]; then echo "Nieprawidlowa liczba paramertow" else while getopts :i:j: par do case $par in i) if [ -r $OPTARG ]; then echo "W pliku jest: `cat -n $OPTARG | tail -1 | awk '{print $1}'` linii" echo "W pliku jest: `wc -w $OPTARG | awk '{print $1}'` slow" echo "W pliku jst: `wc -c $OPTARG | awk '{print $1}'` znakow" echo "Plik zajmuje: `ls -il | grep -w $OPTARG | awk '{printf $6}'` bajtów" fi;; j) lista=$(diff -s "$1" "$2" | grep ident | sed 's/.*\///;s/\ .*//') ^^^^^^^^^^ if [ -z "$lista" ]; then printf "\n Brak identycznych plików w podanych katalogach\n" else printf "\n--- Pliki identyczne ---\n" printf "\n$lista\n" printf "\n------- Koniec -------\n" fi exit $?;; ?) echo "Nieznana opcja."; exit;; esac done; fi
Podkreśliłem wadliwy fragment.
Nie chcę wypowiadać się autorytarnie, a w książce sprawdzać mi się nie chce (późno już), ale wynika jakoby getopts nie wpływał na zmienne $1 i $2 (chociaż jestem przekonany, że jest tam mechanizm automatycznego shiftowania...).
Czyli w Twoim przykładzie:
./skrypt.sh -j etc nowy
$0 : ./skrypt.sh
$1 : -j
$2 : etc
$3 : nowy
Sam już widzisz, gdzie jest błąd.
Innym błędem jest korzystanie z optarg i odwoływanie się do elementów polecenia przez zmienne numeryczne. Po to masz $OPTARG żeby tego nie robić. Jak kiedyś chciałem, żeby jeden przełącznik przyjmował dwa argumenty naskrobałem coś takiego (fragment kodu):
numery () { nr1=$OPTARG for ((i=0 ; i <= $BASH_ARGC; i++ )); do if [ ${BASH_ARGV[$i]} == "-l" ]; then nr2=${BASH_ARGV[$((i - 2))]} break fi done } while getopts ":n:l:g:h" flaga; do case $flaga in l ) numery 2> /dev/null shift ;; esac done
Offline