Jak porównać zmienną do łańcucha (i zrobić coś, jeśli się zgadzają)?
Jak porównać zmienną do łańcucha (i zrobić coś, jeśli się zgadzają)?
Odpowiedzi:
if [ "$x" = "valid" ]; then
echo "x has the value 'valid'"
fi
Jeśli chcesz coś zrobić, gdy nie są one zgodne, wymienić =
z !=
. Możesz przeczytać więcej o operacjach na łańcuchach i operacjach arytmetycznych w odpowiedniej dokumentacji.
$x
?Chcesz znaleźć cudzysłowy $x
, ponieważ jeśli jest pusty, skrypt Bash napotka błąd składniowy, jak pokazano poniżej:
if [ = "valid" ]; then
==
operatoraZauważ, że Bash pozwala ==
na równe traktowanie [
, ale nie jest to standard .
Użyj pierwszego przypadku, w którym cudzysłowy $x
są opcjonalne:
if [[ "$x" == "valid" ]]; then
lub użyj drugiego przypadku:
if [ "$x" = "valid" ]; then
[ "$1" == "on" ]
. Zmiana na [„$ 1” = „on”] rozwiązała problem.
=
a nie dwa.
[ $x -eq "valid" ]
. -eq
jest operatorem porównania liczb całkowitych, a nie ciągów.
["x$yes" == "xyes"]
, który poprzedza zarówno zmienną, jak i literał ciągiem znakiem x
? Czy to relikt dawnych czasów, czy jest naprawdę potrzebny w niektórych sytuacjach?
Lub, jeśli nie potrzebujesz innej klauzuli:
[ "$x" == "valid" ] && echo "x has the value 'valid'"
echo
może się nie powieść.
[ "$X" == "valid" ] || ( echo invalid && false ) && echo "valid"
.
{ echo invalid && false; }
jest bardziej wydajny ( echo invalid && false )
, ponieważ unika płacenia za niepotrzebną podpowłokę.
a="abc"
b="def"
# Equality Comparison
if [ "$a" == "$b" ]; then
echo "Strings match"
else
echo "Strings don't match"
fi
# Lexicographic (greater than, less than) comparison.
if [ "$a" \< "$b" ]; then
echo "$a is lexicographically smaller then $b"
elif [ "$a" \> "$b" ]; then
echo "$b is lexicographically smaller than $a"
else
echo "Strings are equal"
fi
Uwagi:
if
a [
i ]
są ważne>
i <
są operatorami przekierowania, więc unikaj go za pomocą \>
i \<
odpowiednio dla ciągów.$a
faktycznie " "
otaczał go jako część wartości literału łańcucha, dlatego musiałem użyć znaku zmiany znaczenia, $b
aby porównać wartości. Znalazłem to po uruchomieniu bash -x ./script.sh
, flaga -x pozwala zobaczyć wartość każdego wykonania i pomaga w debugowaniu.
Aby porównać ciągi znaków z symbolami wieloznacznymi, użyj
if [[ "$stringA" == *$stringB* ]]; then
# Do something here
else
# Do Something here
fi
"
symbole wieloznaczne. (btw: +1 za symbole wieloznaczne!)
$stringB
musi być notowane (i, nawiasem mówiąc, lewa strona nie musi być cytowany) if [[ $stringA = *"$stringB"* ]]; then
.
Nie mogę zgodzić się z jednym z komentarzy w jednym punkcie:
[ "$x" == "valid" ] && echo "valid" || echo "invalid"
Wygląda to tak, jakby ktoś, niewtajemniczony ...
W pewnym sensie używa wspólnych wzorców jako języka;
A kiedy nauczysz się języka.
Jest to proste wyrażenie logiczne, z jedną specjalną częścią: leniwą oceną operatorów logicznych.
[ "$x" == "valid" ] && echo "valid" || echo "invalid"
Każda część jest logicznym wyrażeniem; pierwsze mogą być prawdziwe lub fałszywe, pozostałe dwa są zawsze prawdziwe.
(
[ "$x" == "valid" ]
&&
echo "valid"
)
||
echo "invalid"
Teraz, gdy jest oceniany, sprawdzany jest pierwszy. Jeśli jest to fałsz, to drugi argument logiki i &&
po nim nie ma znaczenia. Pierwsze nie jest prawdą, więc i tak nie może być pierwsze, a drugie być prawdą.
W tym przypadku jest to pierwsza strona logiki lub ||
fałsz, ale może być prawdą, jeśli druga strona - trzecia część - jest prawdziwa.
Tak więc trzecia część zostanie poddana ocenie - głównie napisanie wiadomości jako efekt uboczny. (Ma wynik 0
dla prawdy, którego nie używamy tutaj)
Pozostałe przypadki są podobne, ale prostsze - i - obiecuję! są - mogą być - łatwe do odczytania!
(Nie mam, ale myślę, że bycie weteranem UNIX z siwą brodą bardzo pomaga w tym.)
... && ... || ...
Zwykle boczyć na (przepraszam greybeard Unix weteranem, masz racji przez cały ten czas), a to nie jest semantycznie równoważne if ... then ... else ...
. Nie martw się, to częsta pułapka .
... && ... || ...
jest idealnie poprawnym wzorcem i wspólnym idiomem bash. Użycie tego wymaga wcześniejszej wiedzy (co warto pamiętać, jeśli na widowni są początkujący), ale OP ma włosy, aby udowodnić, że wiedzą, jak unikać otwartych pokryw włazów.
możesz również użyć przypadku użycia / esac
case "$string" in
"$pattern" ) echo "found";;
esac
|
przed, przed )
. in
Stwierdzenie jest równoznaczne then
w if
sprawozdaniu. Można argumentować, że działa na liście wzorców, gdzie każda lista ma własną deklarację co zrobić, jeśli pochodzisz z Pythona. Nie tak substring in string
, ale raczej for item in list
. *
Jeśli chcesz else
spełnić warunek, użyj a jako ostatniego stwierdzenia . Powraca przy pierwszym spotkaniu.
Poniższy skrypt czyta wiersz po wierszu z pliku o nazwie „testonthis”, a następnie porównuje każdy wiersz z prostym ciągiem, ciągiem znaków specjalnych i wyrażeniem regularnym. Jeśli się nie zgadza, skrypt wypisze wiersz, w przeciwnym razie nie.
Przestrzeń w Bash jest bardzo ważna. Więc będą działać:
[ "$LINE" != "table_name" ]
Ale następujące nie będą:
["$LINE" != "table_name"]
Więc proszę używać jak jest:
cat testonthis | while read LINE
do
if [ "$LINE" != "table_name" ] && [ "$LINE" != "--------------------------------" ] && [[ "$LINE" =~ [^[:space:]] ]] && [[ "$LINE" != SQL* ]]; then
echo $LINE
fi
done
bash
ale ponieważ [
jest tak naprawdę zewnętrznym plikiem binarnym (ponieważ which [
daje coś podobnego /usr/bin/[
)
Prawdopodobnie użyłbym dopasowań wyrażenia regularnego, jeśli dane wejściowe zawierają tylko kilka poprawnych wpisów. Np. Tylko „start” i „stop” są prawidłowymi działaniami.
if [[ "${ACTION,,}" =~ ^(start|stop)$ ]]; then
echo "valid action"
fi
Zauważ, że zmienię małe litery $ACTION
, używając podwójnego przecinka. Zauważ też, że to nie zadziała w przypadku zbyt starych wersji bash.
Przykłady Bash 4+. Uwaga: niestosowanie cudzysłowów spowoduje problemy, gdy słowa zawierają spacje itp. Zawsze cytuj w Bash, IMO.
Oto kilka przykładów w Bash 4+:
Przykład 1, sprawdź ciąg „tak” (bez rozróżniania wielkości liter):
if [[ "${str,,}" == *"yes"* ]] ;then
Przykład 2, sprawdź ciąg „tak” (bez rozróżniania wielkości liter):
if [[ "$(echo "$str" | tr '[:upper:]' '[:lower:]')" == *"yes"* ]] ;then
Przykład 3, sprawdź ciąg „tak” (rozróżniana jest wielkość liter):
if [[ "${str}" == *"yes"* ]] ;then
Przykład 4, sprawdź ciąg „tak” (rozróżniana jest wielkość liter):
if [[ "${str}" =~ "yes" ]] ;then
Przykład 5, dopasowanie ścisłe (wielkość liter ma znaczenie):
if [[ "${str}" == "yes" ]] ;then
Przykład 6, dopasowanie ścisłe (bez rozróżniania wielkości liter):
if [[ "${str,,}" == "yes" ]] ;then
Przykład 7, dopasowanie ścisłe:
if [ "$a" = "$b" ] ;then
Cieszyć się.
if [ "$a"="$b" ]
lub to nie działa ... nie mogę mieć spacji wokół równych