Operadores básicos de Shell

Shell, al igual que otros lenguajes de programación, admite múltiples operadores, incluyendo:

  • Operadores aritméticos
  • Operadores relacionales
  • Operadores booleanos
  • Operadores de cadenas
  • Operadores de prueba de archivos

El bash nativo no admite operaciones matemáticas simples, pero se pueden realizar mediante otros comandos, como awk y expr; expr es el más utilizado.

expr es una herramienta de cálculo de expresiones; con ella se puede evaluar una expresión.

Por ejemplo, sumar dos números (Tenga en cuenta que se utilizan acentos graves (backticks)`y no comillas simples.'):

Ejemplo

#!/bin/bash

val=`expr 2 + 2`
echo "La suma de los dos números es :$val"

Al ejecutar el script, la salida es la siguiente:

两数之和为 : 4

Dos observaciones:

  • Debe haber espacios entre la expresión y el operador; por ejemplo, 2+2 es incorrecto, debe escribirse como 2 + 2. Esto es diferente de la mayoría de los lenguajes de programación que conocemos.
  • La expresión completa debe estar` `envuelta entre `...`; tenga en cuenta que este carácter no es la comilla simple habitual, está debajo de la tecla Esc.

Operadores aritméticos

La siguiente tabla enumera los operadores aritméticos comunes, asumiendo que la variable a es 10 y la variable b es 20:

Operador Descripción Ejemplo
+ Suma `expr $a + $b` da como resultado 30.
- Resta `expr $a - $b` da como resultado -10.
* Multiplicación `expr $a \* $b` da como resultado 200.
/ División `expr $b / $a` da como resultado 2.
% Residuo `expr $b % $a` da como resultado 0.
= Asignación a=$b asigna el valor de la variable b a la variable a.
== Igualdad. Se utiliza para comparar dos números; si son iguales, devuelve true. [ $a == $b ] devuelve false.
!= Desigualdad. Se utiliza para comparar dos números; si no son iguales, devuelve true. [ $a != $b ] devuelve true.

Nota:Las expresiones condicionales deben colocarse entre corchetes y deben tener espacios; por ejemplo:[$a==$b]es incorrecto, debe escribirse como[ $a == $b ]。

Ejemplo

A continuación se muestra un ejemplo de operadores aritméticos:

Ejemplo

#!/bin/bash
# autor: Tutorial para novatos
# url:www.example.com

a=10
b=20

val=`expr $a + $b`
echo "a + b : $val"

val=`expr $a - $b`
echo "a - b : $val"

val=`expr $a \* $b`
echo "a * b : $val"

val=`expr $b / $a`
echo "b / a : $val"

val=`expr $b % $a`
echo "b % a : $val"

if [ $a == $b ]
then
   echo a es igual a b
fi
if [ $a != $b ]
then
   echo a no es igual a b
fi

Al ejecutar el script, la salida es la siguiente:

a + b : 30
a - b : -10
a * b : 200
b / a : 2
b % a : 0
a 不等于 b

Nota:

  • El signo de multiplicación (*) debe ir precedido de una barra invertida (\) para poder realizar la multiplicación;
  • if...then...fi es una declaración condicional; se explicará más adelante.
  • En Mac, la sintaxis de expr en shell es:$((expresión)); aquí, el "*" en la expresión no necesita el carácter de escape "\".

Operadores relacionales

Los operadores relacionales solo admiten números, no cadenas, a menos que el valor de la cadena sea un número.

La siguiente tabla enumera los operadores relacionales comunes, asumiendo que la variable a es 10 y la variable b es 20:

Operador Descripción Ejemplo
-eq Comprueba si dos números son iguales; si lo son, devuelve true. [ $a -eq $b ] devuelve false.
-ne Comprueba si dos números no son iguales; si no lo son, devuelve true. [ $a -ne $b ] devuelve true.
-gt Comprueba si el número de la izquierda es mayor que el de la derecha; si es así, devuelve true. [ $a -gt $b ] devuelve false.
-lt Comprueba si el número de la izquierda es menor que el de la derecha; si es así, devuelve true. [ $a -lt $b ] devuelve true.
-ge Comprueba si el número de la izquierda es mayor o igual que el de la derecha; si es así, devuelve true. [ $a -ge $b ] devuelve false.
-le Comprueba si el número de la izquierda es menor o igual que el de la derecha; si es así, devuelve true. [ $a -le $b ] devuelve true.

Ejemplo

A continuación se muestra un ejemplo de operadores relacionales:

Ejemplo

#!/bin/bash
# autor: Tutorial para novatos
# url:www.example.com

a=10
b=20

if [ $a -eq $b ]
then
   echo "$a -eq $b: a es igual a b"
else
   echo "$a -eq $b: a no es igual a b"
fi
if [ $a -ne $b ]
then
   echo "$a -ne $b: a no es igual a b"
else
   echo "$a -ne $b: a es igual a b"
fi
if [ $a -gt $b ]
then
   echo "$a -gt $b: a es mayor que b"
else
   echo "$a -gt $b: a no es mayor que b"
fi
if [ $a -lt $b ]
then
   echo "$a -lt $b: a es menor que b"
else
   echo "$a -lt $b: a no es menor que b"
fi
if [ $a -ge $b ]
then
   echo "$a -ge $b: a es mayor o igual que b"
else
   echo "$a -ge $b: a es menor que b"
fi
if [ $a -le $b ]
then
   echo "$a -le $b: a es menor o igual que b"
else
   echo "$a -le $b: a es mayor que b"
fi

Al ejecutar el script, la salida es la siguiente:

10 -eq 20: a 不等于 b
10 -ne 20: a 不等于 b
10 -gt 20: a 不大于 b
10 -lt 20: a 小于 b
10 -ge 20: a 小于 b
10 -le 20: a 小于或等于 b

Operadores booleanos

La siguiente tabla enumera los operadores booleanos comunes, asumiendo que la variable a es 10 y la variable b es 20:

Operador Descripción Ejemplo
! Operación NOT: si la expresión es true, devuelve false; de lo contrario, devuelve true. [ ! false ] devuelve true.
-o Operación OR: si una de las expresiones es true, devuelve true. [ $a -lt 20 -o $b -gt 100 ] devuelve true.
-a Operación AND: solo devuelve true si ambas expresiones son true. [ $a -lt 20 -a $b -gt 100 ] devuelve false.

Ejemplo

A continuación se muestra un ejemplo de operadores booleanos:

Ejemplo

#!/bin/bash
# autor: Tutorial para novatos
# url:www.example.com

a=10
b=20

if [ $a != $b ]
then
   echo "$a != $b: a no es igual a b"
else
   echo "$a == $b: a es igual a b"
fi
if [ $a -lt 100 -a $b -gt 15 ]
then
   echo "$amenor que 100 y$bmayor que 15 : devuelve true"
else
   echo "$amenor que 100 y$bmayor que 15 : devuelve false"
fi
if [ $a -lt 100 -o $b -gt 100 ]
then
   echo "$amenor que 100 o$bmayor que 100 : devuelve true"
else
   echo "$amenor que 100 o$bmayor que 100 : devuelve false"
fi
if [ $a -lt 5 -o $b -gt 100 ]
then
   echo "$amenor que 5 o$bmayor que 100 : devuelve true"
else
   echo "$amenor que 5 o$bmayor que 100 : devuelve false"
fi

Al ejecutar el script, la salida es la siguiente:

10 != 20 : a 不等于 b
10 小于 100 且 20 大于 15 : 返回 true
10 小于 100 o  20 大于 100 : 返回 true
10 小于 5 o  20 大于 100 : 返回 false

Operadores lógicos

A continuación se presentan los operadores lógicos de Shell, asumiendo que la variable a es 10 y la variable b es 20:

Operador Descripción Ejemplo
&& AND lógico [[ $a -lt 100 && $b -gt 100 ]] devuelve false
|| OR lógico [[ $a -lt 100 || $b -gt 100 ]] devuelve true

Ejemplo

A continuación se muestra un ejemplo de operadores lógicos:

Ejemplo

#!/bin/bash
# autor: Tutorial para novatos
# url:www.example.com

a=10
b=20

if [[ $a -lt 100 && $b -gt 100 ]]
then
   echo Devuelve true
else
   echo Devuelve false
fi

if [[ $a -lt 100 || $b -gt 100 ]]
then
   echo Devuelve true
else
   echo Devuelve false
fi

Ejecute el script, la salida es la siguiente:

返回 false
返回 true

Operadores de cadenas

La siguiente tabla enumera los operadores de cadena comunes, asumiendo que la variable a es "abc" y la variable b es "efg":

Operador Descripción Ejemplo
= Comprueba si dos cadenas son iguales; si son iguales, devuelve true. [ $a = $b ] devuelve false.
!= Comprueba si dos cadenas no son iguales; si no son iguales, devuelve true. [ $a != $b ] devuelve true.
-z Comprueba si la longitud de la cadena es 0; si es 0, devuelve true. [ -z $a ] devuelve false.
-n Comprueba si la longitud de la cadena no es 0; si no es 0, devuelve true. [ -n "$a" ] devuelve true.
$ Comprueba si la cadena no está vacía; si no está vacía, devuelve true. [ $a ] devuelve true.

Ejemplo

Un ejemplo de operadores de cadena es el siguiente:

Ejemplo

#!/bin/bash
# autor: Tutorial para novatos
# url:www.example.com

a="abc"
b="efg"

if [ $a = $b ]
then
   echo "$a = $b: a es igual a b
else
   echo "$a = $b: a no es igual a b
fi
if [ $a != $b ]
then
   echo "$a != $b: a no es igual a b
else
   echo "$a != $b: a es igual a b
fi
if [ -z $a ]
then
   echo "-z $a: la longitud de la cadena es 0
else
   echo "-z $a: la longitud de la cadena no es 0
fi
if [ -n "$a" ]
then
   echo "-n $a: la longitud de la cadena no es 0
else
   echo "-n $a: la longitud de la cadena es 0
fi
if [ $a ]
then
   echo "$a: la cadena no está vacía
else
   echo "$a: la cadena está vacía
fi

Ejecute el script, la salida es la siguiente:

abc = efg: a 不等于 b
abc != efg : a 不等于 b
-z abc : 字符串长度不为 0
-n abc : 字符串长度不为 0
abc : 字符串不为空

Operadores de prueba de archivos

Los operadores de prueba de archivos se utilizan para comprobar varias propiedades de los archivos Unix.

La descripción de las pruebas de propiedades es la siguiente:

Operador Descripción Ejemplo
-b file Comprueba si el archivo es un archivo de dispositivo de bloque; si lo es, devuelve true. [ -b $file ] devuelve false.
-c file Comprueba si el archivo es un archivo de dispositivo de caracteres; si lo es, devuelve true. [ -c $file ] devuelve false.
-d file Comprueba si el archivo es un directorio; si lo es, devuelve true. [ -d $file ] devuelve false.
-f file Comprueba si el archivo es un archivo normal (ni un directorio ni un archivo de dispositivo); si lo es, devuelve true. [ -f $file ] devuelve true.
-g file Comprueba si el archivo tiene el bit SGID establecido; si es así, devuelve true. [ -g $file ] devuelve false.
-k file Comprueba si el archivo tiene el bit adhesivo (Sticky Bit) establecido; si es así, devuelve true. [ -k $file ] devuelve false.
-p file Comprueba si el archivo es una tubería con nombre; si lo es, devuelve true. [ -p $file ] devuelve false.
-u file Comprueba si el archivo tiene el bit SUID establecido; si es así, devuelve true. [ -u $file ] devuelve false.
-r file Comprueba si el archivo es legible; si lo es, devuelve true. [ -r $file ] devuelve true.
-w file Comprueba si el archivo es escribible; si lo es, devuelve true. [ -w $file ] devuelve true.
-x file Comprueba si el archivo es ejecutable; si lo es, devuelve true. [ -x $file ] devuelve true.
-s file Comprueba si el archivo está vacío (si el tamaño del archivo es mayor que 0); si no está vacío, devuelve true. [ -s $file ] devuelve true.
-e file Comprueba si el archivo (incluidos los directorios) existe; si es así, devuelve true. [ -e $file ] devuelve true.

Otros operadores de comprobación:

  • -S: Comprueba si un archivo es un socket.
  • -L: Comprueba si el archivo existe y es un enlace simbólico.

Ejemplo

La variable file representa el archivo/var/www/ejemplo/test.sh, su tamaño es de 100 bytes y tienerwxpermisos. El siguiente código comprobará varias propiedades de este archivo:

Ejemplo

#!/bin/bash
# autor: Tutorial para novatos
# url:www.example.com

file="/var/www/ejemplo/test.sh"
if [ -r $file ]
then
   echo El archivo es legible
else
   echo El archivo no es legible
fi
if [ -w $file ]
then
   echo El archivo es escribible
else
   echo El archivo no es escribible
fi
if [ -x $file ]
then
   echo El archivo es ejecutable
else
   echo El archivo no es ejecutable
fi
if [ -f $file ]
then
   echo El archivo es un archivo normal
else
   echo El archivo es un archivo especial
fi
if [ -d $file ]
then
   echo El archivo es un directorio
else
   echo El archivo no es un directorio
fi
if [ -s $file ]
then
   echo El archivo no está vacío
else
   echo El archivo está vacío
fi
if [ -e $file ]
then
   echo El archivo existe
else
   echo El archivo no existe
fi

Ejecute el script, la salida es la siguiente:

El archivo es legible
El archivo es escribible
El archivo es ejecutable
El archivo es un archivo normal
El archivo no es un directorio
El archivo no está vacío
El archivo existe

Operadores de incremento y decremento

Aunque el propio Shell no tiene operadores ++ y -- como C, C++ o Java, se puede lograr la misma funcionalidad mediante otros métodos. A continuación se presentan algunos métodos comunes:

Usando el comando let

letEl comando permite realizar operaciones aritméticas con enteros.

Ejemplo

#!/bin/bash

# Inicializar la variable
num=5

# Incremento
let num++

# Decremento
let num--

echo $num

Realizando operaciones aritméticas con $(( ))

$(( ))La sintaxis también es una forma de realizar operaciones aritméticas.

Ejemplo

#!/bin/bash

# Inicializar la variable
num=5

# Incremento
num=$((num + 1))

# Decremento
num=$((num - 1))

echo $num

Usando el comando expr

exprEl comando puede usarse para operaciones aritméticas, pero en los scripts modernos no es tanlety$(( ))común.

Ejemplo

#!/bin/bash

# Inicializar la variable
num=5

# Incremento
num=$(expr $num + 1)

# Decremento
num=$(expr $num - 1)

echo $num

Realizando operaciones aritméticas con (( ))

Similar a $(( )), la sintaxis (( )) también se puede utilizar para operaciones aritméticas.

Ejemplo

#!/bin/bash

# Inicializar la variable
num=5

# Incremento
((num++))

# Decremento
((num--))

echo $num

Ejemplo

A continuación se muestra un script de ejemplo completo que demuestra el uso de las operaciones de incremento y decremento:

Ejemplo

#!/bin/bash

# Inicializar la variable
num=5

echo Valor inicial:$num"

# Incremento
let num++
echo Después del incremento:$num"

# Decremento
let num--
echo Después del decremento:$num"

# Usando $(( ))
num=$((num + 1))
echo Usando$(( )) después del incremento:$num"

num=$((num - 1))
echo Usando$(( )) después del decremento:$num"

# Usando expr
num=$(expr $num + 1)
echo Después del incremento con expr:$num"

num=$(expr $num - 1)
echo Después del decremento con expr:$num"

# Usando (( ))
((num++))
echo Después del incremento usando (( )):$num"

((num--))
echo Después del decremento usando (( )):$num"

Al ejecutar este script se obtendrá el siguiente resultado:

初始值: 5
自增后: 6
自减后: 5
使用 $(( )) 自增后: 6
使用 $(( )) 自减后: 5
使用 expr 自增后: 6
使用 expr 自减后: 5
使用 (( )) 自增后: 6
使用 (( )) 自减后: 5
Otras extensiones