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
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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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 使用 (( )) 自减后: 5Otras extensiones