[BASH] Funkcja --help...
- rryk
- 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...
jak zrobić ab jeżeli ktoś wpisze kod.sh --help to pojawi się pomoc?
- m_gol
- 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...
Kod: Zaznacz cały
sudo apt-get install manpages-posix
man getopts
Michał Gołębiowski
student wydziału Matematyki, Informatyki i Mechaniki na Uniwersytecie Warszawskim
student wydziału Matematyki, Informatyki i Mechaniki na Uniwersytecie Warszawskim
- paszczak000
- 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...
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
- m_gol
- 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...
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:
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:
To już wygląda ładnie i strukturalnie, w przeciwieństwie do tego, co zaproponował kolega. 
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.
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

Michał Gołębiowski
student wydziału Matematyki, Informatyki i Mechaniki na Uniwersytecie Warszawskim
student wydziału Matematyki, Informatyki i Mechaniki na Uniwersytecie Warszawskim
- rryk
- 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...
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
komenda.sh --drukuj=info
lub
komenda.sh -d info
i w zaleznosci co wpisze zamiast info wykona inna akcje
- m_gol
- 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...
Tak jak mówiłem - wtedy po parametrze wstawiasz dwukropek. W tym, co podałem, parametr b brał argument. Dla help zamiast:
wpiszesz:
Parametr jest automatycznie zapisywany do zmiennej OPTARG, odwołujesz się do niej jak do każdej innej zmiennej środowiskowej, np.:
Kod: Zaznacz cały
getopts "h(help)"
Kod: Zaznacz cały
getopts "h:(help)"
Kod: Zaznacz cały
i=$OPTARG
Michał Gołębiowski
student wydziału Matematyki, Informatyki i Mechaniki na Uniwersytecie Warszawskim
student wydziału Matematyki, Informatyki i Mechaniki na Uniwersytecie Warszawskim
- paszczak000
- 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...
m_gol jasne, że getops jest lepsze i bardziej profesjonalne, ale to był przykład na szybko 

"Nobody will ever need Windows" -- logical conclusion
- m_gol
- 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...
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. 
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:


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
student wydziału Matematyki, Informatyki i Mechaniki na Uniwersytecie Warszawskim
-
- 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...
getops nie obsługuje długiej opcji poprzedzonej dwoma minusami.
Proponuję użyć poniższego rozwiązania - jest ono bardziej praktyczne.
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
- m_gol
- 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...
Obsługuje. Pod warunkiem, że istnieje jednoliterowy alias. Ostatecznie, te przykłady które podałem działają...nUmer pisze:getops nie obsługuje długiej opcji poprzedzonej dwoma minusami
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
student wydziału Matematyki, Informatyki i Mechaniki na Uniwersytecie Warszawskim
- rryk
- 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...
heh a jak mam mieć zamiar parę parametrów to jak się do poszczególnych odwołać??
- m_gol
- 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...
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.rryk pisze:heh a jak mam mieć zamiar parę parametrów to jak się do poszczególnych odwołać??
Michał Gołębiowski
student wydziału Matematyki, Informatyki i Mechaniki na Uniwersytecie Warszawskim
student wydziału Matematyki, Informatyki i Mechaniki na Uniwersytecie Warszawskim
- rryk
- 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...
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
to zadziała?? i jeszcze jedno jesli argument dla parametru m wynosi wiecej niz jeden wyraz to będzie jakiś problem??
Kod: Zaznacz cały
while getopts "m:k:" opcja
do
case $opcja in
m) message=$OPTARG;;
k) costam=$OPTARG;;
?) echo "error";;
esac
done
- m_gol
- 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...
Tak. Pisałem o tym przecież...rryk pisze:do jakiej zmiennej jest zapisywane to co podam np jeden parametr dla -m jeden dla -k i zapisze to w takim kodzieto zadziała??Kod: Zaznacz cały
while getopts "m:k:" opcja do case $opcja in m) message=$OPTARG;; k) costam=$OPTARG;; ?) echo "error";; esac done
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.rryk pisze:jesli argument dla parametru m wynosi wiecej niz jeden wyraz to będzie jakiś problem??
Michał Gołębiowski
student wydziału Matematyki, Informatyki i Mechaniki na Uniwersytecie Warszawskim
student wydziału Matematyki, Informatyki i Mechaniki na Uniwersytecie Warszawskim
- rryk
- 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...
acha spox ale bez rozbijania to by takie coś działało ??
- m_gol
- 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...
Tylko tak jak napisałem - w cudzysłowie.rryk pisze:acha spox ale bez rozbijania to by takie coś działało ??
Michał Gołębiowski
student wydziału Matematyki, Informatyki i Mechaniki na Uniwersytecie Warszawskim
student wydziału Matematyki, Informatyki i Mechaniki na Uniwersytecie Warszawskim
- rryk
- 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...
O co chodzi??? Oto wycinek kodu który powoduje u mnie problem:
bo jak wpisze ./skrypt.sh -uptime to się uruchamia uptime, info i miejsce ^^ a chodziło mi o sam uptime.
Kod: Zaznacz cały
while getopts "h(help)i(info)u(uptime)w(wyslij)m(miejsce)" opcja
- m_gol
- 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...
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ć:rryk pisze:jak wpisze ./skrypt.sh -uptime to się uruchamia uptime, info i miejsce ^^ a chodziło mi o sam uptime.
Kod: Zaznacz cały
program -a -b -c n
Kod: Zaznacz cały
program -abc n

Kod: Zaznacz cały
./skrypt.sh --uptime
Michał Gołębiowski
student wydziału Matematyki, Informatyki i Mechaniki na Uniwersytecie Warszawskim
student wydziału Matematyki, Informatyki i Mechaniki na Uniwersytecie Warszawskim
- rryk
- 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...
Najpierw mam takie logi:
Illegal option --
[: 107: missing ]
potem już tylko tak jak przez jeden -
czyli nic niedało
Illegal option --
[: 107: missing ]
potem już tylko tak jak przez jeden -
czyli nic niedało
- m_gol
- 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...
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ę.
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
student wydziału Matematyki, Informatyki i Mechaniki na Uniwersytecie Warszawskim
Kto jest online
Użytkownicy przeglądający to forum: Bing [Bot] i 10 gości