Bash i wykorzystanie getopt w skrypcie

Potrzebujesz pomocy z C, C++, perl, python, itp.
JacO^
Posty: 2
Rejestracja: 11 listopada 2013, 02:04

Bash i wykorzystanie getopt w skrypcie

Post autor: JacO^ »

Cześć!

Chcę napisać skrypt o nazwie wytnij, który wykorzystując programy head i tail wyświetli na wyjściu fragment pliku w zakresie wierszy zadanych argumentami opcjonalnymi -s (start) i -e (end).

Np. :

Kod: Zaznacz cały

wytnij -s 5 -e 15
wyświetli wiersze od 5 do 15.

W przypadku braku argumentu -s wyświetlane są wiersze od początku, a w przypadku braku argumentu -e wyświetlane są wiersze do końca.

Potrzebuję użyć programu getopt i mimo czytania wielu przykładów i opisów, nie mogę zrozumieć jak to zrobić, żeby działało tak, jak jest opisane powyżej. Mam coś takiego:

Kod: Zaznacz cały

set -- `getopt seo: $*`
           if test $? != 0
           then
                   echo $USAGE
                   exit 2
           fi
           while [ $# -ge 1 ]
           do
                   case $1 in
                           -s)	SFLAG=1; shift;;
                           -e)	EFLAG=1; shift;;
                           -o)	OARG=$2 shift2;; 
			   --)	shift; break;;
			   -*)	echo $USAGE; exit 1;;
			    *)	break;;
                   esac
           done
Potem pojawi się zapewne problem odpowiedniego użycia poleceń head i tail, ale najpierw chcę sobie poradzić z tym.

Bardzo proszę o pomoc.

Pozdrawiam,
Jacek
mariaczi
Member
Posty: 1343
Rejestracja: 08 lutego 2008, 12:58
Lokalizacja: localhost@śląskie

Post autor: mariaczi »

Zerknij:

Kod: Zaznacz cały

#!/bin/bash

usage() { echo "Usage: $0 [-s <num>] [-e <num>]" 1>&2; exit 1; }

while getopts ":s:e:" o; do
    case "${o}" in
        s)
            s=${OPTARG}
            if ! [[ ${s} =~ ^[0-9]+$ ]] ; then
                usage
            fi
            ;;
        e)
            e=${OPTARG}
            if ! [[ ${e} =~ ^[0-9]+$ ]] ; then
                usage
            fi
            ;;
        *)
            usage
            ;;
    esac
done
shift $((OPTIND-1))

if [[ -z "${s}" ]] || [[ -z "${e}" ]]; then
    usage
fi

echo "s = ${s}"
echo "e = ${e}"
ODPOWIEDZ