Mam następujący if
blok w skrypcie bash:
if [ ${PACKAGENAME} -eq kakadu-v6_4-00902C ]; then
echo "successfully entered if block!!"
fi
Wykonanie skryptu nie wchodzi do mojego if
bloku, mimo że $PACKAGENAME
jest równe kakadu-v6_4-00902C
. Co ja robię źle?
bash
shell-script
test
DemiSheep
źródło
źródło
-eq
jest prawdziwe w przypadku liczb całkowitych, chcesz przetestować ciąg lub wyrażenie regularne (==
lub=~
): mywiki.wooledge.org/BashGuide/TestsAndConditionalsjasonwryan
Przyjrzę się temu zasobowi!Odpowiedzi:
-eq
jest operatorem arytmetycznym, który porównuje dwie liczby.Użyj
=
(przenośny / standardowysh
)=~
lub==
zamiast niego.Używaj także cudzysłowów, ponieważ jeśli
${PACKAGENAME}
zawiera biały znak lub znak wieloznaczny, zostanie on podzielony na wiele argumentów, co spowoduje[
wyświetlenie większej liczby argumentów niż jest to pożądane. Zobacz tutaj listę typowych pułapek bash.Zobacz
man bash
, szukaj ( /) dlaCONDITIONAL EXPRESSIONS
.źródło
polym
, spojrzę, dzięki za zasób! Otworzę tę kartę obok mojego przewodnika VI. :)[[ $PACKAGENAME == "kakadu..." ]]
jest OK.=
,==
a!=
ponieważ ta strona jest wzorem, a nie łańcuchem. Na przykładfoo='*'; [[ whatever = $foo ]]
prawda.Wymień
-eq
się==
więc jeśli blok będzie to: -źródło
Innym sposobem jest ich zanegowanie:
Wyżej blokowe Pierwsze testy jeśli
"$PACKAGENAME"
ma żadnej wartości w ogóle, a jeśli nie to wyjście z błędem i echa?'this'}
dostderr
. Jeśli jego powłoka nadrzędna nadal istnieje, test przeszedł pomyślnie, a następnie sprawdza, czy usunięcie łańcucha „kakadu ...” ze zmiennej skutkuje-z
pustym ciągiem. Jeśli nie, to ponownie emituje błąd i wychodzi z powłoki. Jeśli twoja powłoka nadal istnieje w tym momencie coś po wykonaniu bloku, w przeciwnym razie tak nie jest.Prawdopodobnie najlepiej jest zaimplementować tę funkcję w funkcji. Lubić:
Dzięki tej funkcji możesz podać tyle argumentów, ile pozwoli twój system. Jeśli podasz mniej niż 2, zwróci 1 i wyśle wiadomość do
stderr
. Jeśli podasz 2 lub więcej argumentów, potraktuje wszystkie jako łańcuchy i zwróci 0, jeśli wszystkie są identyczne i nie będą zerowe, w przeciwnym razie zwróci numer argumentu, który jako pierwszy nie przejdzie kontroli.W twoim przypadku można go użyć w następujący sposób:
Aby zademonstrować dalej, napiszę inną funkcję:
PRÓBNY:
WYDAJNOŚĆ:
źródło