[BASH] Funkcja --help...

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
Awatar użytkownika
rryk
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 206
Rejestracja: 04 mar 2008, 16:00
Płeć: Mężczyzna
Wersja Ubuntu: 9.04
Środowisko graficzne: GNOME
Kontakt:

[BASH] Funkcja --help...

Post autor: rryk »

jak zrobić ab jeżeli ktoś wpisze kod.sh --help to pojawi się pomoc?
Awatar użytkownika
m_gol
Sędziwy Jeż
Sędziwy Jeż
Posty: 31
Rejestracja: 25 paź 2007, 07:40
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: GNOME
Architektura: x86_64

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

Post autor: m_gol »

Kod: Zaznacz cały

sudo apt-get install manpages-posix
man getopts
W manie są przykłady.
Michał Gołębiowski
student wydziału Matematyki, Informatyki i Mechaniki na Uniwersytecie Warszawskim
Awatar użytkownika
paszczak000
Piegowaty Guziec
Piegowaty Guziec
Posty: 6
Rejestracja: 10 lut 2009, 12:50
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: GNOME
Kontakt:

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

Post 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
"Nobody will ever need Windows" -- logical conclusion
Awatar użytkownika
m_gol
Sędziwy Jeż
Sędziwy Jeż
Posty: 31
Rejestracja: 25 paź 2007, 07:40
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: GNOME
Architektura: x86_64

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

Post 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. :)
Michał Gołębiowski
student wydziału Matematyki, Informatyki i Mechaniki na Uniwersytecie Warszawskim
Awatar użytkownika
rryk
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 206
Rejestracja: 04 mar 2008, 16:00
Płeć: Mężczyzna
Wersja Ubuntu: 9.04
Środowisko graficzne: GNOME
Kontakt:

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

Post 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
Awatar użytkownika
m_gol
Sędziwy Jeż
Sędziwy Jeż
Posty: 31
Rejestracja: 25 paź 2007, 07:40
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: GNOME
Architektura: x86_64

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

Post 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
Michał Gołębiowski
student wydziału Matematyki, Informatyki i Mechaniki na Uniwersytecie Warszawskim
Awatar użytkownika
paszczak000
Piegowaty Guziec
Piegowaty Guziec
Posty: 6
Rejestracja: 10 lut 2009, 12:50
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: GNOME
Kontakt:

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

Post autor: paszczak000 »

m_gol jasne, że getops jest lepsze i bardziej profesjonalne, ale to był przykład na szybko ;-)
"Nobody will ever need Windows" -- logical conclusion
Awatar użytkownika
m_gol
Sędziwy Jeż
Sędziwy Jeż
Posty: 31
Rejestracja: 25 paź 2007, 07:40
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: GNOME
Architektura: x86_64

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

Post 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
Michał Gołębiowski
student wydziału Matematyki, Informatyki i Mechaniki na Uniwersytecie Warszawskim
nUmer
Piegowaty Guziec
Piegowaty Guziec
Posty: 11
Rejestracja: 26 lut 2009, 19:46
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Fluxbox
Kontakt:

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

Post 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

Awatar użytkownika
m_gol
Sędziwy Jeż
Sędziwy Jeż
Posty: 31
Rejestracja: 25 paź 2007, 07:40
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: GNOME
Architektura: x86_64

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

Post 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...
Michał Gołębiowski
student wydziału Matematyki, Informatyki i Mechaniki na Uniwersytecie Warszawskim
Awatar użytkownika
rryk
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 206
Rejestracja: 04 mar 2008, 16:00
Płeć: Mężczyzna
Wersja Ubuntu: 9.04
Środowisko graficzne: GNOME
Kontakt:

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

Post autor: rryk »

heh a jak mam mieć zamiar parę parametrów to jak się do poszczególnych odwołać??
Awatar użytkownika
m_gol
Sędziwy Jeż
Sędziwy Jeż
Posty: 31
Rejestracja: 25 paź 2007, 07:40
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: GNOME
Architektura: x86_64

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

Post 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.
Michał Gołębiowski
student wydziału Matematyki, Informatyki i Mechaniki na Uniwersytecie Warszawskim
Awatar użytkownika
rryk
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 206
Rejestracja: 04 mar 2008, 16:00
Płeć: Mężczyzna
Wersja Ubuntu: 9.04
Środowisko graficzne: GNOME
Kontakt:

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

Post 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??
Awatar użytkownika
m_gol
Sędziwy Jeż
Sędziwy Jeż
Posty: 31
Rejestracja: 25 paź 2007, 07:40
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: GNOME
Architektura: x86_64

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

Post 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.
Michał Gołębiowski
student wydziału Matematyki, Informatyki i Mechaniki na Uniwersytecie Warszawskim
Awatar użytkownika
rryk
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 206
Rejestracja: 04 mar 2008, 16:00
Płeć: Mężczyzna
Wersja Ubuntu: 9.04
Środowisko graficzne: GNOME
Kontakt:

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

Post autor: rryk »

acha spox ale bez rozbijania to by takie coś działało ??
Awatar użytkownika
m_gol
Sędziwy Jeż
Sędziwy Jeż
Posty: 31
Rejestracja: 25 paź 2007, 07:40
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: GNOME
Architektura: x86_64

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

Post 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.
Michał Gołębiowski
student wydziału Matematyki, Informatyki i Mechaniki na Uniwersytecie Warszawskim
Awatar użytkownika
rryk
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 206
Rejestracja: 04 mar 2008, 16:00
Płeć: Mężczyzna
Wersja Ubuntu: 9.04
Środowisko graficzne: GNOME
Kontakt:

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

Post 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.
Awatar użytkownika
m_gol
Sędziwy Jeż
Sędziwy Jeż
Posty: 31
Rejestracja: 25 paź 2007, 07:40
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: GNOME
Architektura: x86_64

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

Post 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
Michał Gołębiowski
student wydziału Matematyki, Informatyki i Mechaniki na Uniwersytecie Warszawskim
Awatar użytkownika
rryk
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 206
Rejestracja: 04 mar 2008, 16:00
Płeć: Mężczyzna
Wersja Ubuntu: 9.04
Środowisko graficzne: GNOME
Kontakt:

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

Post autor: rryk »

Najpierw mam takie logi:
Illegal option --
[: 107: missing ]

potem już tylko tak jak przez jeden -
czyli nic niedało
Awatar użytkownika
m_gol
Sędziwy Jeż
Sędziwy Jeż
Posty: 31
Rejestracja: 25 paź 2007, 07:40
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: GNOME
Architektura: x86_64

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

Post 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ę.
Michał Gołębiowski
student wydziału Matematyki, Informatyki i Mechaniki na Uniwersytecie Warszawskim
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Bing [Bot] i 10 gości