Próbuję stworzyć skrypt powłoki, którego należy użyć w następujący sposób:
ocrscript.sh -from /home/kristoffer/test.png -to /home/kristoffer/test.txt
Skrypt następnie ocr skonwertuje plik obrazu na plik tekstowy. Oto, co do tej pory wymyśliłem:
#!/bin/bash
export HOME=/home/kristoffer
/usr/local/bin/abbyyocr9 -rl Swedish -if ???fromvalue??? -of ???tovalue??? 2>&1
Ale nie wiem, jak uzyskać wartości -from
i -to
. Jakieś pomysły, jak to zrobić?
linux
bash
shell
parameters
Kristoffer
źródło
źródło
Odpowiedzi:
Argumenty, które dostarczają do bashscript pojawi się w zmiennych
$1
i$2
oraz$3
gdzie liczba odnosi się do argumentu.$0
to samo polecenie.Argumenty są oddzielone spacjami, więc jeśli podasz
-from
i-to
w poleceniu, znajdą się one również w tych zmiennych, więc w tym przypadku:Dostaniesz:
Łatwiej byłoby pominąć
-from
i-to
, na przykład:Wtedy będziesz miał:
Wadą jest to, że będziesz musiał dostarczyć go we właściwej kolejności. Istnieją biblioteki, które mogą ułatwić analizowanie nazwanych argumentów w wierszu poleceń, ale zwykle w przypadku prostych skryptów powłoki powinieneś po prostu użyć prostego sposobu, jeśli nie stanowi to problemu.
Następnie możesz:
Podwójne cudzysłowy wokół
$1
i$2
nie zawsze są konieczne, ale są adviced, ponieważ niektóre ciągi nie będzie działać, jeśli nie umieścić je między cudzysłów.źródło
Jeśli nie jesteś całkowicie przywiązany do używania „od” i „do” jako nazw opcji, dość łatwo zaimplementować to za pomocą getopts :
getopts
to program, który przetwarza argumenty wiersza poleceń i wygodnie je analizuje.f:t:
określa, że oczekujesz 2 parametrów zawierających wartości (wskazane przez dwukropek). Coś jak tof:t:v
mówi-v
będzie interpretowane tylko jako flaga.opts
to miejsce, w którym przechowywany jest bieżący parametr. Plikcase
Stwierdzenie jest gdzie można przetworzyć tego.${OPTARG}
zawiera wartość następującą po parametrze.${FROM_VAL}
na przykład otrzyma wartość/home/kristoffer/test.png
jeśli uruchomiłeś swój skrypt, taki jak:ocrscript.sh -f /home/kristoffer/test.png -t /home/kristoffer/test.txt
Jak sugerują inni, jeśli po raz pierwszy piszesz skrypty basha, powinieneś naprawdę zapoznać się z podstawami. To był tylko krótki samouczek dotyczący
getopts
działania.źródło
f:t:vs
będzie-f some_f -t some_t -v -s
Używać zmiennych
"$1"
,"$2"
,"$3"
i tak dalej do argumentów dostępu. Aby uzyskać dostęp do wszystkich, możesz użyć"$@"
lub uzyskać liczbę argumentów$#
(może być przydatne sprawdzenie, czy nie ma za mało lub za dużo argumentów).źródło
Musiałem się upewnić, że moje skrypty są całkowicie przenośne między różnymi maszynami, powłokami, a nawet wersjami Cygwin. Co więcej, moi koledzy, dla których musiałem pisać skrypty, są programistami, więc skończyło się na tym:
Uzasadnienie: Dołączyłem również
launcher.sh
skrypt, ponieważ cała operacja składała się z kilku kroków, które były od siebie prawie niezależne (mówię „quasi”, ponieważ chociaż każdy skrypt można było uruchomić samodzielnie, zwykle wszystkie były uruchamiane razem ) i po dwóch dniach dowiedziałem się, że około połowa moich kolegów, programistów i wszyscy, byli zbyt dobrzy, aby korzystać z pliku programu uruchamiającego, śledzić jego „użycie” lub przeczytać POMOC, która wyświetlała się za każdym razem, gdy coś robili źle i robili bałagan, uruchamiając skrypty z argumentami w złej kolejności i narzekając, że skrypty nie działają poprawnie. Będąc cholerykiem, zdecydowałem się odświeżyć wszystkie moje scenariusze, aby upewnić się, że są odporne na współpracowników. Segment kodu powyżej był pierwszą rzeczą.źródło
W bashu
$1
jest to pierwszy argument przekazywany do skryptu,$2
drugi i tak dalejMożesz więc użyć:
Wyjaśnienie podwójnych cudzysłowów;
rozważ trzy skrypty:
Teraz wywołaj:
Kiedy wywołujesz
foo.sh "a b"
, wywołujebar.sh a b
(dwa argumenty), a wraz zfoo2.sh "a b"
nim wywołujebar.sh "a b"
(1 argument). Zawsze miej na uwadze, w jaki sposób parametry są przekazywane i rozszerzane w bashu, dzięki temu zaoszczędzisz wiele bólu głowy.źródło