¿Cómo comparo una variable con una cadena (y hago algo si coinciden)?
¿Cómo comparo una variable con una cadena (y hago algo si coinciden)?
Respuestas:
if [ "$x" = "valid" ]; then
echo "x has the value 'valid'"
fi
Si desea hacer algo cuando no coinciden, reemplace =
con !=
. Puede leer más sobre las operaciones de cadena y las operaciones aritméticas en su documentación respectiva.
$x
?Desea las comillas $x
, porque si está vacío, su script Bash encuentra un error de sintaxis como se ve a continuación:
if [ = "valid" ]; then
==
operadorTenga en cuenta que Bash permite ==
ser utilizado para igualdad con [
, pero esto no es estándar .
Utilice el primer caso en el que las comillas $x
son opcionales:
if [[ "$x" == "valid" ]]; then
o use el segundo caso:
if [ "$x" = "valid" ]; then
[ "$1" == "on" ]
. Cambiar esto a ["$ 1" = "on"] resolvió el problema.
=
y no dos.
[ $x -eq "valid" ]
. -eq
es el operador de comparación para enteros, no cadenas.
["x$yes" == "xyes"]
, que es el prefijo de la variable y el literal de cadena con un x
? ¿Es una reliquia de los viejos tiempos o es realmente necesario en algunas situaciones?
O, si no necesita otra cláusula:
[ "$x" == "valid" ] && echo "x has the value 'valid'"
echo
puede fallar.
[ "$X" == "valid" ] || ( echo invalid && false ) && echo "valid"
.
{ echo invalid && false; }
es más eficiente que ( echo invalid && false )
, ya que evita pagar una subshell innecesaria.
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:
if
y [
y ]
son importantes>
y <
son operadores de redireccionamiento, así que escapa con \>
y \<
respectivamente para cadenas.$a
realmente lo " "
rodeaba como parte del valor literal de la cadena, por lo tanto, tuve que usar el carácter de escape $b
para comparar los valores. Pude encontrar esto después de ejecutar bash -x ./script.sh
, el indicador -x le permite ver el valor de cada ejecución y ayuda en la depuración.
Para comparar cadenas con comodines use
if [[ "$stringA" == *$stringB* ]]; then
# Do something here
else
# Do Something here
fi
"
alrededor de los comodines. (por cierto: +1 para comodines!)
$stringB
debe ser citado (y, de paso, la izquierda no tiene que ser citado): if [[ $stringA = *"$stringB"* ]]; then
.
Tengo que estar en desacuerdo con uno de los comentarios en un punto:
[ "$x" == "valid" ] && echo "valid" || echo "invalid"
Es solo que parece uno para, hmm, los no iniciados ...
Utiliza patrones comunes como lenguaje, en cierto modo;
Y después de que aprendiste el idioma.
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 siempre son 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 no es relevante. El primero no es cierto, por lo que no puede ser el primero y el segundo, 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 se evaluará la tercera parte, principalmente escribiendo el mensaje como un efecto secundario. (Tiene el resultado 0
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).
... && ... || ...
lo general, está mal visto (lo siento veterano de Unix de barba gris, te has equivocado todo este tiempo), ya que no es semánticamente equivalente a if ... then ... else ...
. No se preocupe, esta es una trampa común .
... && ... || ...
es un patrón perfectamente válido y un idioma común de bash. Su uso prescribe conocimientos previos (lo que puede ser bueno tener en cuenta si hay principiantes en la audiencia), pero OP tiene el pelo para demostrar que saben cómo evitar las tapas de alcantarillas abiertas.
también puedes usar use case / esac
case "$string" in
"$pattern" ) echo "found";;
esac
|
, antes de )
. La in
declaración es equivalente a then
en if
declaraciones. Podrías argumentar que funciona sobre una lista de patrones, donde cada lista tiene su propia declaración de qué hacer, si vienes de Python. No como substring in string
, sino más bien for item in list
. Use a *
como su última declaración si desea una else
condición. Regresa en el primer encuentro.
El siguiente script 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, el script imprimirá la línea, de lo contrario no.
El espacio en Bash es muy importante. Entonces lo siguiente funcionará:
[ "$LINE" != "table_name" ]
Pero lo siguiente no lo hará:
["$LINE" != "table_name"]
Así que por favor use como está:
cat testonthis | while read LINE
do
if [ "$LINE" != "table_name" ] && [ "$LINE" != "--------------------------------" ] && [[ "$LINE" =~ [^[:space:]] ]] && [[ "$LINE" != SQL* ]]; then
echo $LINE
fi
done
bash
sino porque [
es en realidad un binario externo (como en which [
rendimientos algo así /usr/bin/[
)
Probablemente usaría coincidencias regexp si la entrada tiene solo unas pocas entradas válidas. Por ejemplo, solo "iniciar" y "detener" son acciones válidas.
if [[ "${ACTION,,}" =~ ^(start|stop)$ ]]; then
echo "valid action"
fi
Tenga en cuenta que pongo en minúscula la variable $ACTION
usando las comas dobles. También tenga en cuenta que esto no funcionará en versiones de bash demasiado antiguas.
Bash 4+ ejemplos. Nota: no usar comillas causará problemas cuando las palabras contengan espacios, etc. Comillas siempre en Bash, IMO.
Aquí hay algunos ejemplos en Bash 4+:
Ejemplo 1, verifique 'sí' en la cadena (no distingue entre mayúsculas y minúsculas):
if [[ "${str,,}" == *"yes"* ]] ;then
Ejemplo 2, verifique 'sí' en la cadena (no distingue entre mayúsculas y minúsculas):
if [[ "$(echo "$str" | tr '[:upper:]' '[:lower:]')" == *"yes"* ]] ;then
Ejemplo 3, verifique 'sí' en la cadena (distingue entre mayúsculas y minúsculas):
if [[ "${str}" == *"yes"* ]] ;then
Ejemplo 4, verifique 'sí' en la cadena (distingue entre mayúsculas y minúsculas):
if [[ "${str}" =~ "yes" ]] ;then
Ejemplo 5, coincidencia exacta (mayúsculas y minúsculas):
if [[ "${str}" == "yes" ]] ;then
Ejemplo 6, coincidencia exacta (sin distinción entre mayúsculas y minúsculas):
if [[ "${str,,}" == "yes" ]] ;then
Ejemplo 7, coincidencia exacta:
if [ "$a" = "$b" ] ;then
Disfrutar.
if [ "$a"="$b" ]
o no funciona ... no puedo tener espacios alrededor de los iguales