Při psaní Bash skriptů budete často muset porovnat dva řetězce, abyste zjistili, zda jsou stejné nebo ne. Dva řetězce jsou stejné, když mají stejnou délku a obsahují stejnou sekvenci znaků.
Tento tutoriál popisuje, jak porovnávat řetězce v Bash.
Porovnávací operátory #
Porovnávací operátory jsou operátory, které porovnávají hodnoty a vracejí true nebo false. Při porovnávání řetězců v Bash můžete použít následující operátory:
string1 = string2
astring1 == string2
- Operátor rovnosti vrátí hodnotu true, pokud jsou operandy stejné.- Použijte
=
operátor stest
[
příkaz. - Použijte
==
operátor s[[
příkaz pro porovnávání vzorů.
- Použijte
string1 != string2
- Operátor nerovnosti vrátí hodnotu true, pokud se operandy nerovnají.string1 =~ regex
- Operátor regulárního výrazu vrátí hodnotu true, pokud levý operand odpovídá rozšířenému regulárnímu výrazu vpravo.string1 > string2
- Operátor větší než vrátí hodnotu true, pokud je levý operand větší než pravý seřazený podle lexikografického (abecedního) pořadí.string1 < string2
- Operátor menší než vrátí hodnotu true, pokud je pravý operand větší než pravý seřazený podle lexikografického (abecedního) pořadí.-z string
- True, pokud je délka řetězce nula.-n string
- True, pokud je délka řetězce nenulová.
Při porovnávání řetězců je třeba vzít v úvahu několik bodů:
- Mezi binárním operátorem a operandy je třeba použít mezeru.
- Vždy používejte dvojité uvozovky kolem názvů proměnných, abyste se vyhnuli problémům s dělením slov nebo shlukováním.
- Bash neodděluje proměnné podle „typu“, proměnné jsou považovány za celé číslo nebo řetězec v závislosti na kontextu.
Zkontrolujte, zda jsou dva řetězce stejné #
Ve většině případů byste při porovnávání řetězců chtěli zkontrolovat, zda jsou řetězce stejné nebo ne.
Následující skript používá příkaz if a test [
příkaz ke kontrole, zda jsou řetězce stejné nebo ne s =
operátor:
#!/bin/bash
VAR1="Linuxize"
VAR2="Linuxize"
if [ "$VAR1" = "$VAR2" ]; then
echo "Strings are equal."
else
echo "Strings are not equal."
fi
Když je skript spuštěn, vytiskne následující výstup.
Strings are equal.
Zde je další skript, který přebírá vstup od uživatele a porovnává dané řetězce. V tomto příkladu použijeme [[
příkaz a ==
operátor.
#!/bin/bash
read -p "Enter first string: " VAR1
read -p "Enter second string: " VAR2
if [[ "$VAR1" == "$VAR2" ]]; then
echo "Strings are equal."
else
echo "Strings are not equal."
fi
Spusťte skript a po zobrazení výzvy zadejte řetězce:
Enter first string: Linuxize
Enter second string: Ubuntu
Strings are not equal.
Můžete také použít logické a &&
a nebo ||
pro porovnání řetězců:
[[ "string1" == "string2" ]] && echo "Equal" || echo "Not equal"
Not equal
Zkontrolujte, zda řetězec obsahuje podřetězec #
Existuje několik způsobů, jak zkontrolovat, zda řetězec obsahuje podřetězec.
Jedním z přístupů je použití obklopit podřetězec symboly hvězdiček *
což znamená shodu všech znaků.
#!/bin/bash
VAR='GNU/Linux is an operating system'
if [[ $VAR == *"Linux"* ]]; then
echo "It's there."
fi
Skript bude opakovat následující:
It's there.
Další možností je použití regulárního výrazu =~
jak je uvedeno níže:
#!/bin/bash
VAR='GNU/Linux is an operating system'
if [[ $VAR =~ .*Linux.* ]]; then
echo "It's there."
fi
Tečka následovaná hvězdičkou .*
odpovídá nule nebo více výskytům jakéhokoli znaku kromě znaku nového řádku.
Zkontrolujte, zda je řetězec prázdný #
Poměrně často budete muset také zkontrolovat, zda je proměnná prázdný řetězec nebo ne. Můžete to udělat pomocí -n
a -z
operátory.
#!/bin/bash
VAR=''
if [[ -z $VAR ]]; then
echo "String is empty."
fi
String is empty.
#!/bin/bash
VAR='Linuxize'
if [[ -n $VAR ]]; then
echo "String is not empty."
fi
String is not empty.
Porovnání řetězců s operátorem případu #
Místo použití testovacích operátorů můžete k porovnání řetězců použít také příkaz case:
#!/bin/bash
VAR="Arch Linux"
case $VAR in
"Arch Linux")
echo -n "Linuxize matched"
;;
Fedora | CentOS)
echo -n "Red Hat"
;;
esac
Linuxize matched.
Lexikografické srovnání #
Lexikografické srovnání je operace, při které jsou dva řetězce porovnávány abecedně porovnáním znaků v řetězci postupně zleva doprava. Tento druh srovnání se používá zřídka.
Následující skripty lexikograficky porovnávají dva řetězce:
#!/bin/bash
VAR1="Linuxize"
VAR2="Ubuntu"
if [[ "$VAR1" > "$VAR2" ]]; then
echo "${VAR1} is lexicographically greater then ${VAR2}."
elif [[ "$VAR1" < "$VAR2" ]]; then
echo "${VAR2} is lexicographically greater than ${VAR1}."
else
echo "Strings are equal"
fi
Skript vypíše následující:
Ubuntu is lexicographically greater than Linuxize.
Závěr č.
Porovnání řetězců je jednou z nejzákladnějších a často používaných operací ve skriptování Bash. Po přečtení tohoto tutoriálu byste měli dobře rozumět tomu, jak porovnávat řetězce v Bash. Můžete se také podívat na naši příručku o zřetězení řetězců.
Pokud máte nějaké dotazy nebo zpětnou vazbu, neváhejte zanechat komentář.