Variables de Shell

En la programación Shell, una variable es un nombre utilizado para almacenar valores de datos.

Al definir una variable, el nombre de la variable no lleva el signo de dólar ($, que sí se requiere en PHP), por ejemplo:

your_name="ejemplo"

Nota: no debe haber espacios entre el nombre de la variable y el signo igual; esto puede ser diferente de todos los lenguajes de programación que conoces. Además, la nomenclatura de las variables debe seguir las siguientes reglas:

  • Solo debe contener letras, números y guiones bajos:El nombre de la variable puede contener letras (sensibles a mayúsculas/minúsculas), números y guiones bajos,_y no puede contener otros caracteres especiales.
  • No puede comenzar con un número:El nombre de la variable no puede comenzar con un número, pero puede contener números.
  • Evita usar palabras clave de Shell:No uses palabras clave de Shell (por ejemplo, if, then, else, fi, for, while, etc.) como nombres de variables, para evitar confusiones.
  • Usa mayúsculas para las constantes:Por convención, los nombres de variables de constantes suelen usar mayúsculas, por ejemploPI=3.14。
  • Evita usar símbolos especiales:Evita en la medida de lo posible usar símbolos especiales en los nombres de variables, ya que pueden entrar en conflicto con la sintaxis de Shell.
  • Evita usar espacios:El nombre de la variable no debe contener espacios, porque los espacios se usan normalmente para separar comandos y argumentos.

Ejemplos de nombres de variables válidos en Shell:

EJEMPLO="www.example.com"
LD_LIBRARY_PATH="/bin/"
_var="123"
var2="abc"

Nombres de variables no válidos:

# 避免使用if作为变量名
if="some_value"
# 避免使用 $ 等特殊符号
variable_with_$=42
?var=123
user*name=ejemplo
# 避免空格
variable with space="value"

Evita espacios a ambos lados del signo igual:

# 正确的赋值
variable_name=value

# 有可能会导致错误
variable_name = value

Además de la asignación directa y explícita, también se puede asignar un valor a una variable mediante una sentencia, como:

for file in `ls /etc`
o
for file in $(ls /etc)

La sentencia anterior recorre los nombres de los archivos del directorio /etc.


Usar variables

Para usar una variable ya definida, solo tienes que anteponer el signo de dólar al nombre de la variable, como:

Ejemplo

your_name="qinjx"
echo $your_name
echo ${your_name}

Las llaves alrededor del nombre de la variable son opcionales; se pueden poner o no. Se añaden para ayudar al intérprete a identificar los límites de la variable, como en el siguiente caso:

Ejemplo

for skill in Ada Coffe Action Java; do
    echo "I am good at ${skill}Script"
done

Si no se ponen llaves alrededor de la variable skill y se escribe echo "I am good at $skillScript", el intérprete tratará $skillScript como una variable (cuyo valor está vacío), y el resultado de la ejecución del código no será el esperado.

Se recomienda poner llaves a todas las variables; es un buen hábito de programación.

Una variable ya definida puede redefinirse, como:

Ejemplo

your_name="tom"
echo $your_name
your_name="alibaba"
echo $your_name

Esta escritura es válida, pero ten en cuenta que en la segunda asignación no se debe escribir $your_name="alibaba"; el signo de dólar ($) se añade solo al usar la variable.

Variables de solo lectura

El comando readonly se puede usar para definir una variable como de solo lectura; el valor de una variable de solo lectura no puede cambiarse.

El siguiente ejemplo intenta cambiar una variable de solo lectura y muestra un error:

Ejemplo

#!/bin/bash

myUrl="https://www.google.com"
readonly myUrl
myUrl="https://www.example.com"

Al ejecutar el script, el resultado es el siguiente:

/bin/sh: NAME: This variable is read only.

Eliminar variables

El comando unset se puede usar para eliminar una variable. Sintaxis:

unset variable_name

Una vez eliminada la variable, no se puede volver a usar. El comando unset no puede eliminar variables de solo lectura.

Ejemplo

Ejemplo

#!/bin/sh

myUrl="https://www.example.com"
unset myUrl
echo $myUrl

La ejecución del ejemplo anterior no producirá ninguna salida.

Tipos de variables

Shell admite diferentes tipos de variables; algunos de los principales incluyen:

Variables de cadena:En Shell, las variables se tratan normalmente como cadenas.

Puedes usar comillas simples'o comillas dobles"para definir cadenas, por ejemplo:

my_string='Hello, World!'

或者

my_string="Hello, World!"

Variables enteras: en algunos Shell, puedes usar eldeclareotypesetcomando para declarar variables enteras.

Tales variables solo contienen valores enteros, por ejemplo:

declare -i my_integer=42

Esta declaración le indica a Shell que trate my_integer como un entero; si se intenta asignar un valor no entero, Shell intentará convertirlo a entero.

Variables de array:Shell también admite arrays, lo que permite almacenar múltiples valores en una variable.

Los arrays pueden ser arrays indexados por enteros o arrays asociativos; a continuación se muestra un ejemplo de un array indexado por enteros simple:

my_array=(1 2 3 4 5)

O un array asociativo:

declare -A associative_array
associative_array["name"]="John"
associative_array["age"]=30

Variables de entorno:Son variables especiales establecidas por el sistema operativo o el usuario, utilizadas para configurar el comportamiento de Shell e influir en su entorno de ejecución.

Por ejemplo, la variable PATH contiene las rutas en las que el sistema operativo busca archivos ejecutables:

echo $PATH

Variables especiales:Hay algunas variables especiales que tienen un significado especial en Shell, por ejemplo$0representa el nombre del script,$1, $2, etc. representan los argumentos del script.

$#representa el número de argumentos pasados al script,$?representa el estado de salida del comando anterior, etc.


Cadenas de Shell

Las cadenas son el tipo de datos más común y útil en la programación Shell (aparte de números y cadenas, no hay muchos otros tipos útiles). Las cadenas pueden usar comillas simples, comillas dobles, o ninguna comilla.

Comillas simples

str='this is a string'

Limitaciones de las cadenas entre comillas simples:

  • Cualquier carácter dentro de comillas simples se muestra tal cual; las variables dentro de cadenas entre comillas simples no son válidas.
  • En una cadena entre comillas simples no puede aparecer una comilla simple individual (ni siquiera con carácter de escape), pero pueden aparecer en pares, usadas para concatenar cadenas.

Comillas dobles

Ejemplo

your_name="ejemplo"
str="Hello, I know you are \"$your_name\"! \n"
echo -e $str

El resultado de salida es:

Hello, I know you are "ejemplo"! 

Ventajas de las comillas dobles:

  • Puede haber variables dentro de comillas dobles
  • Pueden aparecer caracteres de escape dentro de comillas dobles

Concatenar cadenas

Ejemplo

your_name="ejemplo"
# Concatenar con comillas dobles
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting  $greeting_1

# Concatenar con comillas simples
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2  $greeting_3

El resultado de salida es:

hello, ejemplo ! hello, ejemplo !
hello, ejemplo ! hello, ${your_name} !

Obtener la longitud de una cadena

Ejemplo

string="abcd"
echo ${#string}   # Salida: 4

Cuando la variable es una cadena,${#string}es equivalente a${#string[0]}:

Ejemplo

string="abcd"
echo ${#string[0]}   # Salida: 4

Extraer subcadenas

El siguiente ejemplo comienza desde el carácter número2de la cadena y extrae4caracteres:

Ejemplo

string="ejemplo is a great site"
echo ${string:1:4} # Salida: unoo

Nota: el índice del primer carácter es0。

Buscar subcadenas

Busca la posición del carácterioo(se calcula la posición de la letra que aparezca primero):

Ejemplo

string="ejemplo is a great site"
echo `expr index "$string" io`  # Salida: 4

Nota:En el script anterior,`son comillas invertidas (backticks), no comillas simples', no te confundas.


Arrays de Shell

Bash admite arrays unidimensionales (no admite arrays multidimensionales) y no limita el tamaño del array.

Similar al lenguaje C, los índices de los elementos de un array comienzan en 0. Para obtener un elemento del array se utiliza el índice; el índice puede ser un entero o una expresión aritmética, y su valor debe ser mayor o igual que 0.

Definir arrays

En Shell, los arrays se representan con paréntesis y los elementos del array se separan con espacios. La forma general de definir un array es:

数组名=(值1 值2 ... 值n)

Por ejemplo:

array_name=(value0 value1 value2 value3)

O bien

array_name=(
value0
value1
value2
value3
)

También se pueden definir por separado los distintos componentes del array:

array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen

No es necesario usar índices consecutivos, y el rango de los índices no tiene límite.

Leer arrays

El formato general para leer el valor de un elemento del array es:

${nombre_del_array[índice]}

Por ejemplo:

valuen=${array_name[n]}

Usar@El símbolo puede obtener todos los elementos del arreglo, por ejemplo:

echo ${array_name[@]}

Obtener la longitud del array

El método para obtener la longitud de un arreglo es el mismo que para obtener la longitud de una cadena, por ejemplo:

Ejemplo

# Obtener el número de elementos del arreglo
length=${#array_name[@]}
# O bien
length=${#array_name[*]}
# Obtener la longitud de un solo elemento del arreglo
length=${#array_name[n]}

Comentarios en Shell

con#Las líneas que comienzan con # son comentarios y el intérprete las ignorará.

Añadiendo un símbolo # a cada línea#se pueden establecer comentarios multilínea, así:

Ejemplo

#--------------------------------------------
# Este es un comentario
# autor: Tutorial de novatos
# site:www.example.com
# slogan: lo que se aprende no es solo tecnología, ¡sino también sueños!
#--------------------------------------------
##### Inicio de la zona de configuración de usuario #####
#
#
# Aquí se puede agregar información descriptiva del script
#
#
##### Fin de la zona de configuración de usuario #####

Si durante el desarrollo encuentras un gran bloque de código que necesita ser comentado temporalmente y luego descomentado, ¿qué deberías hacer?

Agregar el símbolo # a cada línea es demasiado laborioso. Se puede encerrar el bloque de código a comentar entre llaves y definirlo como una función; si no se llama a esa función en ningún lugar, este código no se ejecutará, logrando el mismo efecto que un comentario.

Comentarios de varias líneas

Usar Here Document

Los comentarios multilínea también pueden usar el siguiente formato:

:<<EOF
Contenido del comentario...
Contenido del comentario...
Contenido del comentario...
EOF

En los ejemplos anteriores,:es un comando vacío, utilizado para ejecutar el documento Here posterior,<<'EOF'indica el inicio del documento Here; COMMENT es el identificador del documento Here. Todo el contenido entre estos dos identificadores se considera un comentario y no se ejecutará.

EOF también puede usar otros símbolos:

Ejemplo

: <<'COMMENT'
Esta es la parte del comentario.
Puede tener múltiples líneas de contenido.
COMMENT


:<<'
Contenido del comentario...
Contenido del comentario...
Contenido del comentario...
'


:<<!
Contenido del comentario...
Contenido del comentario...
Contenido del comentario...
!

Usar directamente el símbolo :

También podemos usar los dos puntos:como comando, y usar comillas simples'para encerrar múltiples líneas de contenido. Como los dos puntos son un comando vacío, este contenido no se ejecutará.

El formato es:: + espacio + comillas simples。

Ejemplo

: '
Esta es la parte del comentario.
Puede tener múltiples líneas de contenido.
'

Otras extensiones