Strona 1 z 1

Bash i wykorzystanie getopt w skrypcie

: 11 listopada 2013, 02:23
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

: 18 listopada 2013, 11:58
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}"