Strona 1 z 2

[BASH] Funkcja --help...

: 10 lut 2009, 09:32
autor: rryk
jak zrobić ab jeżeli ktoś wpisze kod.sh --help to pojawi się pomoc?

Odp: [BASH] Funkcja --help...

: 10 lut 2009, 10:33
autor: m_gol

Kod: Zaznacz cały

sudo apt-get install manpages-posix
man getopts
W manie są przykłady.

Odp: [BASH] Funkcja --help...

: 10 lut 2009, 13:06
autor: paszczak000
Masz tutaj mały skrypcik. Wyciągnij sobie to co potrzebujesz ;-)

Kod: Zaznacz cały

# Main script
if [ $# -ne 0 ]; then
	if [ "$1" == "--now" ] || [ "$1" == "-n" ]; then
		# Create file to compare.
		touch -t `date +%m%d%H%m` /tmp/$$
		
		# Find all files that are modified today (since start of create file in /tmp)
		# in current or $path directory and its sub-directories:
		find $path -type f -newer /tmp/$$
		
		# Clean after work
		rm -f /tmp/$$
		exit 0
	elif [ "$1" == "--help" ] || [ "$1" == "-h" ]; then
		echo ""
		echo "Usage $0 OPTION"
		echo "Test scripts environment."
		echo ""
		echo "Mandatory arguments to long options are mandatory for short options too."
		echo -e " -h, --help\t\tdisplay this help and exit"
		echo -e " -n, --now\t\tfind last modified files"
		exit 0
	else
		echo "$0: unrecognized option \`$1\`"
		echo "Try \`$0 --help\` for more information."
		exit 0
	fi
else
	echo "$0: unrecognized option \`$1\`"
	echo "Try \`$0 --help\` for more information."
	exit 0
fi

Odp: [BASH] Funkcja --help...

: 10 lut 2009, 13:26
autor: m_gol
Nie jest to ładne rozwiązanie. Jeśli chce się obsługiwać jednoliterowe opcje, to lepiej użyć getopts (radzi sobie z obsługą takich rzeczy, jak połączone parametry: "-a -b -c" znaczy to samo, co t "-abc"). Jeśli chcemy obsługiwać i te długie, to już tak łatwo nie ma, zdaje się. Ale i tak do takich celów lepiej użyć case i parsować napisy, przelatując parametry w pętli - przecież parametrów może być więcej, a działanie skryptu ZAZWYCZAJ nie powinno zależeć od ich kolejności... Poza tym przy takim case lepiej widać, co się dzieje, niż w takich wielokrotnych ifach.

Twoje rozwiązanie jest trochę mało uniwersalne. :)

EDIT: O, mam. Z mana:

Kod: Zaznacz cały

 Each short option can have multiple long option equivalents,
     although  this is in violation of the CLIP specification and
     should be used with caution.  You  must  enclose  each  long
     option equivalent parentheses, as follows:

     getopts "f:(file)(input-file)o:(output-file)"

     In the above example, both --file and --input-file  are  the
     equivalent of -f, and --output-file is the equivalent of -o.
Czyli, jeśli chcesz to mieć ładnie zrobione, to najlepiej zdefiniuj oprócz --help również -h, które robi to samo. Ta opcja nie bierze parametru, więc nie będzie dwukropka. Czyli taki byłby przykład:

Kod: Zaznacz cały

while getopts "h(help)ab:c" opcja
  do
    case $opcja in
    h) DRUKUJ_POMOC;;
    a) OBSŁUŻ_OPCJĘ_A;;
    b) OBSŁUŻ_OPCJĘ_B (podany argument jest w zmiennej OPTARG);;
    c) OBSŁUŻ_OPCJĘ_C;;
    ?) Rzuć błędem, że nie ma takiej opcji;;
    esac
 done
To już wygląda ładnie i strukturalnie, w przeciwieństwie do tego, co zaproponował kolega. :)

Odp: [BASH] Funkcja --help...

: 10 lut 2009, 15:38
autor: rryk
jak zrobic cos w podobie do tego co podales tylko zeby mozna bylo podawac jakis argument typu:
komenda.sh --drukuj=info
lub
komenda.sh -d info
i w zaleznosci co wpisze zamiast info wykona inna akcje

Odp: [BASH] Funkcja --help...

: 10 lut 2009, 16:17
autor: m_gol
Tak jak mówiłem - wtedy po parametrze wstawiasz dwukropek. W tym, co podałem, parametr b brał argument. Dla help zamiast:

Kod: Zaznacz cały

getopts "h(help)"
wpiszesz:

Kod: Zaznacz cały

getopts "h:(help)"
Parametr jest automatycznie zapisywany do zmiennej OPTARG, odwołujesz się do niej jak do każdej innej zmiennej środowiskowej, np.:

Kod: Zaznacz cały

i=$OPTARG

Odp: [BASH] Funkcja --help...

: 10 lut 2009, 18:08
autor: paszczak000
m_gol jasne, że getops jest lepsze i bardziej profesjonalne, ale to był przykład na szybko ;-)

Odp: [BASH] Funkcja --help...

: 10 lut 2009, 18:18
autor: m_gol
No tak, rozumiem, ale lepiej ludzi uczyć od początku dobrych nawyków. ;) Bo potem się kończy na czymś tak paskudnym jak składnia polecenia pdftk. :D

Przykład: aby wydrukować do pdfa stronę nr 1 jednego dokumentu obróconą o 90 stopni oraz stronę nr 2 drugiego, trzeba zrobić coś takiego:

Kod: Zaznacz cały

pdftk A=INPUT_FILE1.pdf B=INPUT_FILE2.pdf cat A1E B2 output OUTPUT_FILE.pdf

Odp: [BASH] Funkcja --help...

: 28 lut 2009, 17:49
autor: nUmer
getops nie obsługuje długiej opcji poprzedzonej dwoma minusami.
Proponuję użyć poniższego rozwiązania - jest ono bardziej praktyczne.

Kod: Zaznacz cały

#!/bin/sh

function pomoc ()
{
    echo "Wyświetli pomoc"
}

while [ $# -gt 0 ]
do
    case $1 in
        -h|--help) pomoc ;;
    esac
    shift 1
done


Odp: [BASH] Funkcja --help...

: 28 lut 2009, 19:25
autor: m_gol
nUmer pisze:getops nie obsługuje długiej opcji poprzedzonej dwoma minusami
Obsługuje. Pod warunkiem, że istnieje jednoliterowy alias. Ostatecznie, te przykłady które podałem działają...

A Twoje rozwiązanie jest o tyle złe, że jeśli oprócz --help chcesz utrzymywać opcje jednoliterowe z możliwością ich mieszania, np. -q, -n, m, to zgodnie z ogólnie przyjętym standardem powinno działać odwoływanie się do nich również przez "-q -nm", "-nqm" itp. itd. Do tego właśnie powstał getopts, a zakodowanie tego ręcznie to mnóstwo syfu... Lepiej już chyba potworzyć te aliasy, jakoś to działa...

Odp: [BASH] Funkcja --help...

: 18 kwie 2009, 11:02
autor: rryk
heh a jak mam mieć zamiar parę parametrów to jak się do poszczególnych odwołać??

Odp: [BASH] Funkcja --help...

: 19 kwie 2009, 17:03
autor: m_gol
rryk pisze:heh a jak mam mieć zamiar parę parametrów to jak się do poszczególnych odwołać??
Parametrów czy argumentów? Nie potrzeba przecież więcej niż jednego argumentu do parametru, lepiej to rozbić na dwa. A jeśli pytasz o parametry, nie argumenty parametrów, to szczerze mówiąc nie rozumiem.

Odp: [BASH] Funkcja --help...

: 19 kwie 2009, 23:37
autor: rryk
sry trochę się pogubiłem przy jednej z twoich wypowiedzi ^^tzn chce wiedzieć do jakiej zmiennej jest zapisywane to co podam np jeden parametr dla -m jeden dla -k i zapisze to w takim kodzie

Kod: Zaznacz cały

while getopts "m:k:" opcja
  do
    case $opcja in
    m) message=$OPTARG;;
    k) costam=$OPTARG;;
    ?) echo "error";;
    esac
 done
to zadziała?? i jeszcze jedno jesli argument dla parametru m wynosi wiecej niz jeden wyraz to będzie jakiś problem??

Odp: [BASH] Funkcja --help...

: 20 kwie 2009, 00:11
autor: m_gol
rryk pisze:do jakiej zmiennej jest zapisywane to co podam np jeden parametr dla -m jeden dla -k i zapisze to w takim kodzie

Kod: Zaznacz cały

while getopts "m:k:" opcja
  do
    case $opcja in
    m) message=$OPTARG;;
    k) costam=$OPTARG;;
    ?) echo "error";;
    esac
 done
to zadziała??
Tak. Pisałem o tym przecież...
rryk pisze:jesli argument dla parametru m wynosi wiecej niz jeden wyraz to będzie jakiś problem??
Rozbij go na dwa, zazwyczaj da się to jakoś naturalnie zrobić. Jeśli naprawdę chcesz przekazać jako parametr napis ze spacją, to otocz go cudzysłowami, żeby był traktowany jako całość. W przypadku liczb to zazwyczaj nie ma sensu.

Odp: [BASH] Funkcja --help...

: 20 kwie 2009, 17:22
autor: rryk
acha spox ale bez rozbijania to by takie coś działało ??

Odp: [BASH] Funkcja --help...

: 20 kwie 2009, 17:37
autor: m_gol
rryk pisze:acha spox ale bez rozbijania to by takie coś działało ??
Tylko tak jak napisałem - w cudzysłowie.

Odp: [BASH] Funkcja --help...

: 24 kwie 2009, 15:14
autor: rryk
O co chodzi??? Oto wycinek kodu który powoduje u mnie problem:

Kod: Zaznacz cały

while getopts "h(help)i(info)u(uptime)w(wyslij)m(miejsce)" opcja
bo jak wpisze ./skrypt.sh -uptime to się uruchamia uptime, info i miejsce ^^ a chodziło mi o sam uptime.

Odp: [BASH] Funkcja --help...

: 24 kwie 2009, 19:30
autor: m_gol
rryk pisze:jak wpisze ./skrypt.sh -uptime to się uruchamia uptime, info i miejsce ^^ a chodziło mi o sam uptime.
Długie opcje poprzedza się dwoma kreskami, krótkie jedną. Chodzi o to, że dzięki takiemu podejściu krótkie opcje można grupować, np. zamiast pisać:

Kod: Zaznacz cały

program -a -b -c n
można napisać:

Kod: Zaznacz cały

program -abc n
W Twoim przypadku odpaliłeś krótkie opcje u, p, t, i, m oraz e. :) Wycinając te, których nie ma, zostaje u, i oraz m. Powinienieś napisać:

Kod: Zaznacz cały

./skrypt.sh --uptime

Odp: [BASH] Funkcja --help...

: 24 kwie 2009, 19:54
autor: rryk
Najpierw mam takie logi:
Illegal option --
[: 107: missing ]

potem już tylko tak jak przez jeden -
czyli nic niedało

Odp: [BASH] Funkcja --help...

: 26 kwie 2009, 22:55
autor: m_gol
Aj, rzeczywiście. Opis wziąłem stąd:
man getopts na berkeley.edu
ale to widać dotyczy tylko SunOS/Solarisa, linuksowa implementacja tego nie wspiera. Poczytaj o getopt, to polecenie pod Linuksem już na pewno potrafi parsować długie opcje...

Rzuć też okiem tu:
Using getopts in bash shell script to get long and short command line options
Jest tam podany link do implementacji funkcji getopts_long, może tak da radę.