Chciałbym, aby mój skrypt Bash wydrukował komunikat o błędzie, jeśli wymagana liczba argumentów nie jest spełniona.
Próbowałem następującego kodu:
#!/bin/bash
echo Script name: $0
echo $# arguments
if [$# -ne 1];
then echo "illegal number of parameters"
fi
Z nieznanego powodu mam następujący błąd:
test: line 4: [2: command not found
Co ja robię źle?
test
. To jest nazwa standardowego polecenia Uniksa, nie chciałbyś go ukrywać.test
porządku, o ile nie ma go na ŚCIEŻCE?Odpowiedzi:
Podobnie jak każde inne proste polecenie
[ ... ]
lubtest
wymaga spacji między jego argumentami.Lub
Propozycje
Będąc w Bash, wolisz używać
[[ ]]
zamiast tego, ponieważ nie powoduje dzielenia słów i rozwijania nazw ścieżek zamiast zmiennych, że cytowanie może nie być konieczne, chyba że jest częścią wyrażenia.Posiada również inne funkcje, takie jak niecytowane grupowanie warunków, dopasowanie wzorca (rozszerzone dopasowanie wzorca z
extglob
) i dopasowanie wyrażenia regularnego.Poniższy przykład sprawdza, czy argumenty są poprawne. Pozwala na pojedynczy argument lub dwa.
Dla czystych wyrażeń arytmetycznych, przy użyciu
(( ))
niektórych może być jeszcze lepiej, ale nadal są możliwe[[ ]]
z jego operatorów arytmetycznych podoba-eq
,-ne
,-lt
,-le
,-gt
, lub-ge
poprzez umieszczenie wyrażenia jako pojedynczy argument wyrażenie:To powinno być pomocne, jeśli musisz połączyć to z innymi funkcjami
[[ ]]
.Wyjście ze skryptu
Logiczne jest również zamknięcie skryptu, gdy zostaną do niego przekazane nieprawidłowe parametry. Zostało to już zasugerowane w komentarzach przez ekangas, ale ktoś edytował tę odpowiedź, aby otrzymać ją
-1
jako wartość zwróconą, więc równie dobrze mogę to zrobić poprawnie.-1
chociaż zaakceptowany przez Bash jako argument,exit
nie jest wyraźnie udokumentowany i nie może być stosowany jako powszechna sugestia.64
Jest również najbardziej formalny, ponieważ wartość jest zdefiniowana wsysexits.h
z#define EX_USAGE 64 /* command line usage error */
. Większość narzędzi takich jakls
zwraca również2
nieprawidłowe argumenty. Zwykłem też wracać2
w swoich skryptach, ale ostatnio tak naprawdę mnie to nie obchodziło i po prostu używałem1
wszystkich błędów. Ale po prostu umieśćmy2
tutaj, ponieważ jest to najczęściej i prawdopodobnie nie jest specyficzne dla systemu operacyjnego.Bibliografia
źródło
[
to tylko kolejne polecenie, npwhich [
. Spróbuj .[
jest wbudowany, a[[
słowo kluczowe. W niektórych starszych powłokach[
nie jest nawet wbudowany. Polecenia takie jak[
naturalnie koegzystują jako polecenia zewnętrzne w większości systemów, ale polecenia wewnętrzne są traktowane priorytetowo przez powłokę, chyba że obejdzie się za pomocącommand
lubexec
. Sprawdź dokumentację powłoki, jak oceniają. Zwróć uwagę na ich różnicę i sposób, w jaki mogą zachowywać się inaczej w każdej powłoce.Dobrym pomysłem może być użycie wyrażeń arytmetycznych, jeśli masz do czynienia z liczbami.
źródło
[ ... ]
Kiedy to dobrze działa i nie są wymagane żadne wymyślne operacje?$(( ))
nie są wymyślne i powinny być implementowane przez wszystkie powłoki POSIX. Jednak(( ))
składnia (bez$
) nie jest jej częścią. Jeśli z jakiegoś powodu jesteś ograniczony, z pewnością możesz użyć[ ]
zamiast tego, ale pamiętaj, że nie powinieneś[[ ]]
również używać . Mam nadzieję, że rozumiesz pułapki[ ]
i powody, dla których te funkcje istnieją. Ale to było pytanie Basha, więc udzielamy odpowiedzi Bash ( „Z reguły [[jest używane w przypadku ciągów i plików. Jeśli chcesz porównać liczby, użyj wyrażenia arytmetycznego” ).W []:! =, =, == ... są operatorami porównywania ciągów , a -eq, -gt ... są arytmetycznymi operatorami binarnymi.
Użyłbym:
Lub:
źródło
==
jest właściwie nieudokumentowaną funkcją, która zdarza się współpracować z GNUtest
. Zdarza się również , że działa z FreeBSDtest
, ale może nie działać na Footest
. Tylko standardowe porównanie jest=
(tylko FYI).dash
:dash -c '[ 1 == 1 ]'
. POSIX określa tylko=
, a nie==
.Jeśli interesuje Cię zwolnienie za kaucją tylko w przypadku braku konkretnego argumentu, podstawienie parametru jest świetne:
źródło
Prosty liniowiec, który działa, można wykonać za pomocą:
To rozkłada się na:
Uważa, że należy pamiętać:
źródło
exit 1
dotyczyłoby tylko kontekstu podpowłoki, czyniąc go po prostu synonimem( usage; false )
. Nie jestem fanem tego rodzaju uproszczenia, jeśli chodzi o analizę opcji, ale możesz użyć{ usage && exit 1; }
zamiast tego. A może po prostu{ usage; exit 1; }
.{...}
jest powszechną składnią i jest dostępna dla większości, jeśli nie wszystkich powłok opartych nash
, nawet tych starszych powłok, które nie spełniają standardów POSIX.Sprawdź ten cheashheash bash, może pomóc wiele.
Aby sprawdzić długość przekazywanych argumentów, użyj
"$#"
Aby użyć tablicy przekazanych argumentów, użyj
"$@"
Przykładem sprawdzania długości i iteracji byłoby:
Ten artykuł pomógł mi, ale brakowało mi kilku rzeczy dla mnie i mojej sytuacji. Mam nadzieję, że to komuś pomaga.
źródło
Jeśli chcesz być po bezpiecznej stronie, polecam użyć getopts.
Oto mały przykład:
zobacz więcej szczegółów tutaj, na przykład http://wiki.bash-hackers.org/howto/getopts_tutorial
źródło
Tutaj prosty jeden linijka, aby sprawdzić, czy podano tylko jeden parametr, w przeciwnym razie wyjdź ze skryptu:
źródło
Powinieneś dodać spacje między warunkami testu:
Mam nadzieję, że to pomoże.
źródło