linux - if else en bash
Cómo comparar cuerdas en Bash (10)
¿Cómo comparo una variable con una cadena (y hago algo si coinciden)?
Usando variables en sentencias if
if [ "$x" = "valid" ]; then
echo "x has the value ''valid''"
fi
Si quieres hacer algo cuando no coinciden, reemplaza =
con !=
. Puede leer más sobre operaciones de cadenas y operaciones aritméticas en su documentación respectiva.
¿Por qué usamos citas alrededor de $x
?
Deseas las comillas alrededor de $x
, porque si está vacío, tu script bash encuentra un error de sintaxis como se ve a continuación:
if [ = "valid" ]; then
Uso no estándar del operador ==
Tenga en cuenta que bash
permite que se use ==
para igualar con [
, pero esto no es estándar .
Utilice el primer caso en el que las citas alrededor de $x
son opcionales:
if [[ "$x" == "valid" ]]; then
o utilice el segundo caso:
if [ "$x" = "valid" ]; then
Bash4 + ejemplos. Nota: no usar comillas causará problemas cuando las palabras contengan espacios, etc. Siempre cite en bash IMO.
Aquí hay algunos ejemplos de BASH4 +:
Ejemplo 1, verifique ''sí'' en la cadena (no distingue mayúsculas y minúsculas):
if [[ "${str,,}" == *"yes"* ]] ;then
Ejemplo 2, verifique ''sí'' en la cadena (no distingue mayúsculas y minúsculas):
if [[ "$(echo "$str" | tr ''[:upper:]'' ''[:lower:]'')" == *"yes"* ]] ;then
Ejemplo 3, verifique ''sí'' en cadena (distingue mayúsculas y minúsculas):
if [[ "${str}" == *"yes"* ]] ;then
Ejemplo 4, verifique ''sí'' en la cadena (distingue mayúsculas y minúsculas)
if [[ "${str}" =~ "yes" ]] ;then
Ejemplo 5, coincidencia exacta (distingue entre mayúsculas y minúsculas):
if [[ "${str}" == "yes" ]] ;then
Ejemplo 6, coincidencia exacta (no distingue mayúsculas y minúsculas):
if [[ "${str,,}" == "yes" ]] ;then
Ejemplo 7, coincidencia exacta:
if [ "$a" = "$b" ] ;then
disfrutar.
Lo hice de esta manera que es compatible con bash, dash (sh):
testOutput="my test"
pattern="my"
case $testOutput in (*"$pattern"*)
echo "if there is a match"
exit 1
;;
(*)
! echo there is no coincidence!
;;esac
O, si no necesitas otra cláusula:
[ "$x" == "valid" ] && echo "x has the value ''valid''"
Para comparar cadenas con comodines use
if [[ "$stringA" == *$stringB* ]]; then
# Do something here
else
# Do Something here
fi
Probablemente use coincidencias de expresiones regulares si la entrada tiene solo unas pocas entradas válidas. Por ejemplo, solo el "inicio" y "detener" son acciones válidas.
if [[ "${ACTION,,}" =~ ^(start|stop)$ ]]; then
echo "valid action"
fi
Tenga en cuenta que escribo la variable $ACTION
usando la coma doble. También tenga en cuenta que esto no funcionará en versiones de bash demasiado antiguas.
También puedes usar case / esac.
case "$string" in
"$pattern" ) echo "found";;
esac
Tengo que estar en desacuerdo con uno de los comentarios en un punto:
[ "$x" == "valid" ] && echo "valid" || echo "invalid"
No, eso no es un oneliner loco
Es solo que parece uno, hmm, el no iniciado ...
Utiliza patrones comunes como lenguaje, en cierto modo;
Y después aprendiste el idioma.
En realidad, es bueno leer
Es una expresión lógica simple, con una parte especial: evaluación perezosa de los operadores lógicos.
[ "$x" == "valid" ] && echo "valid" || echo "invalid"
Cada parte es una expresión lógica; El primero puede ser verdadero o falso, los otros dos son siempre verdaderos.
(
[ "$x" == "valid" ]
&&
echo "valid"
)
||
echo "invalid"
Ahora, cuando se evalúa, se comprueba el primero. Si es falso, el segundo operando de la lógica y &&
después de que no sea relevante. Lo primero no es cierto, por lo que no puede ser lo primero y lo segundo puede ser verdad, de todos modos.
Ahora, en este caso es el primer lado de la lógica o ||
falso, pero podría ser cierto si el otro lado, la tercera parte, es verdadero.
Entonces, la tercera parte será evaluada, principalmente escribiendo el mensaje como un efecto secundario. (Tiene el resultado 0
para verdadero, que no usamos aquí)
Los otros casos son similares, pero más simples ... ¡y lo prometo! son - pueden ser - fáciles de leer!
(No tengo uno, pero creo que ser un veterano de UNIX con barba gris ayuda mucho con esto).
la siguiente secuencia de comandos lee un archivo llamado "testonthis" línea por línea y luego compara cada línea con una cadena simple, una cadena con caracteres especiales y una expresión regular si no coincide, la secuencia de comandos imprimirá la línea o / w no.
El espacio en bash es muy importante. así que lo siguiente funcionará
[ "$LINE" != "table_name" ]
pero el siguiente no lo hará:
["$LINE" != "table_name"]
así que por favor use como es:
cat testonthis | while read LINE
do
if [ "$LINE" != "table_name" ] && [ "$LINE" != "--------------------------------" ] && [[ "$LINE" =~ [^[:space:]] ]] && [[ "$LINE" != SQL* ]]; then
echo $LINE
fi
done
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
Notas:
- Los espacios entre
if
y[
y]
son importantes -
>
y<
son operadores de redireccionamiento, así que escapa con/>
y/<
respectivamente para cadenas.