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/.
Użytkownik

Jakim poleceniem mogę policzyć liczbę wierszy w pliku tekstowym???
I jeszcze takie pytanko na uboczy do czego służy opcja OPTARG??
Offline






Admin łajza







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
Użytkownik

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;
fiTzn. 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




Użyszkodnik
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;
fiPodkreś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
doneOffline