El rol y el tipo de variables en la programación de Shell

1. La función y el tipo de variables de Shell

El concepto de "variables" se utiliza en varios entornos de Shell. Las variables de shell se utilizan para almacenar parámetros (valores) específicos que el sistema y los usuarios necesitan utilizar, y estos parámetros se pueden cambiar según la configuración del usuario o los cambios en el entorno del sistema. Mediante el uso de variables, el programa Shell puede proporcionar funciones más flexibles y una mayor adaptabilidad.
Los tipos de variables de shell comunes incluyen variables personalizadas, variables de entorno, variables de solo lectura, variables de ubicación y variables predefinidas .

Dos variables personalizadas

Las variables personalizadas son variables definidas por los propios usuarios del sistema, que solo son válidas en el propio entorno Shell del usuario, por lo que también se denominan variables locales. Al escribir un programa de script de Shell, algunas variables personalizadas específicas generalmente se configuran para adaptarse a varios cambios durante la ejecución del programa y satisfacer diferentes necesidades.

1. Definir nuevas variables

Las operaciones variables en Bash son relativamente simples, no tan complicadas como otros lenguajes de programación de alto nivel (como C / C ++, Java, etc.). Al definir una nueva variable, generalmente no es necesario declararla de antemano, sino especificar directamente el nombre de la variable y asignarlo al valor inicial (contenido). El formato básico para definir variables es "nombre de variable = valor de variable" sin espacios a ambos lados del signo igual. El nombre de la variable debe comenzar con una letra o un guión bajo, y el nombre no debe contener caracteres especiales (como +, -, *, /,.,?,%, &, #, Etc.).

Por ejemplo, si desea definir una variable llamada "Producto" (valor Python) y una variable llamada "Versión" (valor 2.7.13), puede hacer lo siguiente.

[root@localhost ~]# Product=Python
[root@localhost ~]# Version=2.7.13
2. Ver y hacer referencia al valor de la variable

Al agregar el símbolo inicial "$" antes del nombre de la variable, puede hacer referencia al valor de una variable. Utilice el comando echo para ver las variables y podrá ver varios valores de variable en un comando echo.

[root@localhost ~]# echo $Product
Python
[root@localhost ~]# echo $Product $Version
Python 2.7.13

Cuando el nombre de la variable se confunde fácilmente con otros caracteres que lo siguen, debe agregar llaves "{}" para encerrarlo, de lo contrario no se puede determinar el nombre correcto de la variable. Para variables indefinidas, mostrará un valor nulo.

[root@localhost ~]# echo $Product2.5	//变量Product2.5 并未定义
.5
[root@localhost ~]# echo ${Product}2.5
Python2.5
3. Operación especial de asignación de variables

Especificar el contenido de la variable directamente después del signo igual "=" es la forma más básica de asignar un valor a una variable. Además, existen algunas operaciones de asignación especiales, que pueden asignar valores a las variables de manera más flexible, para que sean adecuadas para diversas tareas de administración complejas. .
(1) Comillas dobles (")
Las comillas dobles se utilizan principalmente para delimitar cadenas de caracteres, especialmente cuando el contenido a asignar contiene espacios, debe ir entre comillas dobles; en otros casos, las comillas dobles suelen omitirse.

Por ejemplo, si desea asignar Python 2.7.13 a la variable PYTHON, debe realizar la operación PYTHON = "Python 2.7.13".

[root@localhost ~]# PYTHON=Python 2.7.13 	//错误的赋值
bash: 2.7.13: command not found
[root@localhost ~]# PYTHON="Python 2.7.13"	//正确的赋值
[root@localhost ~]# echo $PYTHON
Python 2.7.13

Dentro del rango de comillas dobles, el valor de otras variables (referencias de variable) se puede citar usando el símbolo " $ ", de modo que el valor de una variable existente se puede llamar directamente para asignar una nueva variable.

Por ejemplo, realice las siguientes operaciones para llamar al valor de la variable Version y asígnelo a una nueva variable PyVersion, el valor final es "Python 2.7.13".

[root@localhost ~]# PyVersion="Python $Version"	//以变量的值进行赋值
[root@localhost ~]# echo $PyVersion
Python 2.7.13

(2) Comillas simples (')
Cuando el contenido que se va a asignar contiene caracteres de significado especial como $, ", \, etc., debe incluirse entre comillas simples. Dentro del alcance de las comillas simples, los valores de otras variables no se pueden citar , Cualquier carácter se trata como un carácter normal. Sin embargo, cuando la asignación contiene una sola comilla ('), debe omitirse con el símbolo \' para evitar conflictos.

[root@localhost ~]# PyVersion='Python $Version'       //$符号不能再引用变量
[root@localhost ~]# echo $PyVersion 	             //原样输出字符串
Python $Version

(3) Backtick (`)
Backtick se utiliza principalmente para la sustitución de comandos, lo que permite que el resultado de la salida de pantalla de ejecutar un comando se asigne a una variable. El rango encerrado por la comilla invertida debe ser una línea de comando ejecutable; de ​​lo contrario, se producirá un error.

Por ejemplo, si desea encontrar la ubicación del programa de comandos useradd en una línea de comandos y enumerar sus atributos detallados, puede realizar las siguientes operaciones.

[root@localhost ~]# ls -lh `which useradd`
-rwxr-x---. 1 root root 101K 8 月 2 2011 /usr/sbin/useradd

La operación anterior es equivalente a ejecutar dos comandos consecutivamente: primero averigüe la ubicación del programa del comando useradd a través del comando which useradd, y luego enumere los atributos del archivo de acuerdo con el resultado de la búsqueda. Durante la ejecución, todo el rango de comillas invertidas se reemplazará con la salida del comando which useradd.

Para extraer la lista de usuarios prohibidos de inicio de sesión del servicio vsftpd y asignarla a la variable DenyList, puede realizar las siguientes operaciones.

[root@localhost ~]# DenyList=`grep -v "^#" /etc/vsftpd/ftpusers`
[root@localhost ~]# echo $DenyList
root bin daemon adm lp sync shutdown halt mail news uucp operator games nobody

Cabe señalar que es difícil implementar operaciones de sustitución de comandos anidadas en una línea de comandos que utilizan apóstrofos inversos. En este momento, puede utilizar " $ () " en lugar de apóstrofos inversos para resolver el problema de anidación.

Por ejemplo, si desea consultar la ubicación del archivo de configuración instalado por el paquete de software que proporciona el programa de comando useradd, puede realizar las siguientes operaciones (reemplazar en orden de adentro hacia afuera).

[root@localhost ~]# rpm -qc $(rpm -qf $(which useradd))
/etc/default/useradd
/etc/login.defs

(4), comando de lectura
Además de las operaciones de asignación anteriores, también puede usar el comando integrado de lectura de Bash para asignar valores a las variables. El comando de lectura se utiliza para pedirle al usuario que ingrese información, a fin de realizar un proceso de interacción simple. Durante la ejecución, se leerá una línea de contenido del dispositivo de entrada estándar (teclado), con espacios como separador, y cada campo leído se asignará a la variable especificada a su vez (el contenido adicional se asignará a la última variable). Si solo hay una variable especificada, toda la línea se asignará a esta variable.
Por ejemplo, realizar la siguiente operación esperará a que el usuario ingrese texto y asigne el contenido ingresado a la variable ToDir1.

[root@localhost ~]# read ToDir1
/opt/backup/	//输入变量ToDir1 的值为/opt/backup/ [root@localhost ~]# echo $ToDir1
/opt/backup/

Para hacer que la interfaz de operación interactiva sea más amigable y mejorar la facilidad de uso, el comando de lectura se puede combinar con la opción "-p" para configurar la información de solicitud para informar al usuario lo que debe ingresar y otros asuntos relacionados.

Por ejemplo, si desea solicitar al usuario que ingrese al directorio de almacenamiento del archivo de respaldo y asigne la información de la ruta ingresada a la variable ToDir2, puede realizar las siguientes operaciones.

[root@localhost ~]# read -p "请指定备份存放目录:" ToDir2
请指定备份存放目录:/opt/backup
[root@localhost ~]# echo $ToDir2
/opt/backup
4. Establecer el alcance de la variable

De forma predeterminada, las variables recién definidas solo son válidas en el entorno Shell actual, por lo que se denominan variables locales. Al ingresar a un subprograma o un nuevo entorno de sub-Shell, las variables locales ya no se pueden usar.

Por ejemplo, después de ejecutar directamente Bash para ingresar un nuevo script de Shell secundario, no será posible hacer referencia al Producto, la Versión y otras variables definidas en el entorno de Shell principal.

[root@localhost ~]# echo "$Product $Version"	//查看当前定义的变量值Python 2.7.13
[root@localhost ~]# bash	//进入子Shell 环境
[root@localhost ~]# echo "$Product $Version" //无法调用父Shell 环境中的变量
[root@localhost ~]# exit                    //返回原有的Shell 环境

Para permitir que las variables definidas por el usuario se sigan utilizando en todos los entornos de sub-Shell y reducir las configuraciones repetidas, las variables especificadas se pueden exportar como variables globales a través de la exportación de comandos internos. El usuario puede especificar varios nombres de variables como parámetros al mismo tiempo (no es necesario utilizar el símbolo "$") y los nombres de las variables están separados por espacios.

[root@localhost ~]# echo "$Product $Version"	//查看当前定义的变量值Python 2.7.13
[root@localhost ~]# export Product Version	   //将Product、Version 设为全局变量
[root@localhost ~]# bash	                 //进入子Shell 环境
[root@localhost ~]# echo "$Product $Version"
Python 2.7.13	                           //可以调用父Shell 的全局变量
[root@localhost ~]# exit	              //返回原有的Shell 环境

Mientras usa la exportación para exportar variables globales, también puede asignar valores a las variables, por lo que no necesita asignar valores por adelantado cuando defina variables globales por primera vez.

Por ejemplo, realice las siguientes operaciones para crear directamente una nueva variable global denominada FQDN.

[root@localhost ~]# export FQDN="www.jb-aptech.com.cn"
[root@localhost ~]# echo $FQDN
www.jb-aptech.com.cn
5. Operación de variables numéricas

Las operaciones numéricas de las variables de shell se utilizan principalmente para el control de procesos de programas de script (como tiempos de ciclo, comparación de uso, etc., que se presentarán en capítulos posteriores). En el entorno de Bash Shell, solo se pueden realizar operaciones simples con enteros y no se admiten operaciones decimales. El cálculo del valor entero se realiza principalmente a través del comando interno expr, y el formato básico se muestra a continuación. Tenga en cuenta que debe haber al menos un espacio entre el operador y la variable.
expr variable 1 operator variable 2 [operator variable 3] ...
Entre ellos, variable 1, variable 2 ... corresponden a la variable numérica que necesita ser calculada (necesita ser llamada con el símbolo "$"). Varios operadores comúnmente usados ​​se describen a continuación.

  • +: Operación de adición.
  • -: Operación de resta.
  • *: Operación de multiplicación Tenga en cuenta que no puede usar solo el símbolo "*", de lo contrario se considerará como un comodín de archivo.
  • /: Operación de división.
  • %: Operación de módulo, también conocida como operación de resto, que se utiliza para calcular el resto después de dividir un valor.
    Por ejemplo, se establecen dos variables X (valor 35) e Y (valor 16), y los resultados de la operación de suma, resta, multiplicación, división y módulo de las variables X e Y se muestran a su vez.
[root@localhost ~]# X=35 
[root@localhost ~]# Y=16
 [root@localhost ~]# expr $X + $Y 51
[root@localhost ~]# expr $X - $Y
19
[root@localhost ~]# expr $X \* $Y
560
[root@localhost ~]# expr $X / $Y
2
[root@localhost ~]# expr $X % $Y
3

Si desea asignar el resultado de la operación a otras variables, puede combinar la operación de sustitución de comandos (usando la comilla inversa).

Por ejemplo, calcule la tercera potencia de la variable Y y asigne el resultado a la variable Ycube.

[root@localhost ~]# Ycube=`expr $Y \* $Y \* $Y`
[root@localhost ~]# echo $Ycube
4096

Tres variables de shell especiales

Además de las variables de Shell definidas por el usuario, también hay una serie de variables especiales en el sistema Linux y el entorno Bash Shell: variables de entorno, variables de solo lectura, variables de ubicación y variables predefinidas.

1. Variables ambientales

Las variables de entorno se refieren a un tipo de variables creadas de antemano por el sistema Linux para necesidades operativas.Se utilizan principalmente para configurar el entorno de trabajo del usuario, incluido el directorio de inicio del usuario, la ruta de búsqueda de comandos, el directorio actual del usuario, la terminal de inicio de sesión, etc. Los valores de las variables de entorno son mantenidos automáticamente por el sistema Linux y cambiarán a medida que cambie el estado del usuario. Utilice el comando env para ver las variables de entorno en el entorno de trabajo actual. Para algunas variables de entorno comunes, debe comprender sus usos respectivos.

Por ejemplo, la variable USER representa el nombre de usuario, HOME representa el directorio de inicio del usuario, LANG representa el idioma y el juego de caracteres, PWD representa el directorio de trabajo actual y PATH representa la ruta de búsqueda del comando.

[root@localhost ~]# env	//选取部分内容
XDG_SESSION_ID=135
HOSTNAME=localhost.localdomain 
…… //省略部分内容

La variable PATH se utiliza para establecer la ruta de búsqueda predeterminada del programa ejecutable. Cuando solo se especifica el nombre del archivo para ejecutar el programa de comandos, el sistema Linux buscará el archivo ejecutable correspondiente en el directorio especificado por la variable PATH. Si no puede encontrarlo, solicitará "comando extraviado".

Por ejemplo, el script first.sh se encuentra en el directorio / root. Si desea ejecutar el script directamente por el nombre del archivo, puede modificar la variable PATH para agregar la ruta de búsqueda o copiar el script first.sh a una carpeta en la ruta de búsqueda existente. debajo.

[root@localhost ~]# vim frist.sh
#!/bin/bash
#一个简单的Shell脚本        //“#”用于注释的内容
cd/opt/                                    //切换到opt目录
echo "当前位于哪个目录:"    //在屏幕显示“ ....... ”
pwd                                          //查看当前在那个目录中
echo "查看当前目录:"      
ls -lh 
[root@localhost ~]# chmod +x first.sh       //为脚本增加执行权限
[root@localhost ~]# ls -lh /root/first.sh	//确认脚本位置
-rwxr-xr-x. 1 root root 27 Jul 4 09:24 /root/first.sh
[root@localhost ~]# echo $PATH	//查看当前搜索路径
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/mysql/bin:/root/bin 
[root@localhost ~]# first.sh	//直接执行时找不到命令
-bash: first.sh: command not found
[root@localhost ~]# PATH="$PATH:/root"	//将/root 添加到搜索路径
[root@localhost ~]# echo $PATH	//查看修改后的搜索路径
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/mysql/bin:/root/bin:/root 
[root@localhost ~]# first.sh	//直接以文件名运行脚本
当前位于哪个目录:
/opt
........... //省略部分内容
2. Variables de solo lectura

Existe un caso especial en las variables de Shell. Una vez establecidas, su valor no se puede cambiar. Estas variables se denominan variables de solo lectura. Al crear una variable, puede establecerla como un atributo de solo lectura, o puede establecer una variable existente como un atributo de solo lectura. Las variables de solo lectura se utilizan principalmente cuando no se permite modificar el valor de la variable.

Por ejemplo, una variable "log_path" se define en la secuencia de comandos para definir la ruta del archivo de registro. Si no desea que se modifique durante la ejecución de la secuencia de comandos, puede establecer esta variable como una variable de solo lectura. Use el comando readonly para definir una variable como una variable de solo lectura, y no se puede modificar mediante reasignación después de la definición.

[root@localhost ~]# name=cloud
[root@localhost ~]# readonly name	//设置为只读变量
[root@localhost ~]# echo $name
cloud
[root@localhost ~]# name=yun
-bash: name: readonly variable	//只读变量不可以被重新赋值
[root@localhost ~]# unset name	//只读变量不可以被删除
//上述 unset 命令通常用于删除变量。
-bash: unset: name: cannot unset: readonly variable
3. Variables de ubicación

Para proporcionar parámetros operativos para el programa a través de la línea de comandos cuando se utilizan programas de script de Shell, Bash introduce el concepto de variables posicionales. Al ejecutar operaciones de línea de comando, el primer campo representa el nombre del comando o el nombre del programa de secuencia de comandos, y los parámetros de cadena restantes se asignan a las variables de posición en orden de izquierda a derecha. Las variables de posición también se denominan parámetros de posición y están representadas por $ 1, $ 2, $ 3, ..., $ 9.

Por ejemplo, cuando se ejecuta la línea de comando "ls -lh / boot /", la primera variable de posición es "-lh", que está representada por "$ 1"; la segunda variable de posición es "/ boot /", que está representada por "$ 2" Dijo. El nombre del comando "ls -lh / boot /" o el script en sí está representado por "$ 0". Aunque el formato de $ 0 es el mismo que el de una variable posicional, $ 0 es una variable predefinida en lugar de una variable posicional.

[root@localhost ~]# vim jf.sh     
#!/bin/bash 
SUM=`expr $1 + $2`                //声明脚本算法
echo "$1 + $2 = $SUM"             //打印到屏幕上
[root@localhost ~]# chmod +x jf.sh   //为脚本增加执行权限
[root@localhost ~]# ./jf.sh 12 34	//$1 为 12、$2 为 34 的情况
12 + 34 = 46
[root@localhost ~]# ./jf.sh 56 78	//$1 为 56、$2 为 78 的情况
56 + 78 = 134
4. Variables predefinidas

Las variables predefinidas son un tipo de variables especiales predefinidas por el programa Bash.Los usuarios solo pueden usar variables predefinidas, pero no pueden crear nuevas variables predefinidas, ni pueden asignar valores directamente a variables predefinidas. Las variables predefinidas se representan mediante una combinación del símbolo "$" y otro símbolo. Los significados de varias variables predefinidas de uso común son los siguientes.

  • $ #: Representa el número de parámetros posicionales en la línea de comando.
  • $ *: indica el contenido de todos los parámetros posicionales.
  • $?: Indica el estado de retorno después de la ejecución del comando anterior. Un valor de retorno de 0 significa que la ejecución es correcta. Cualquier valor devuelto distinto de cero significa que la ejecución es anormal. El uso de la variable $? Se presentará en el próximo capítulo.
  • $ 0: representa el nombre del script o programa que se está ejecutando actualmente.

Para ilustrar el rol de las variables predefinidas, lo siguiente es escribir un pequeño script de operación de respaldo, usado para empaquetar y comprimir múltiples archivos o directorios especificados por la línea de comando, y generar información relacionada. Entre ellos, la marca de tiempo UNIX (la cantidad de segundos que han transcurrido desde el 1 de enero de 1970) está incrustada en el nombre del archivo comprimido recién creado y se obtiene mediante el comando "date +% s".

[root@localhost ~]# vim mybak.sh
#!/bin/bash
TARFILE=beifen-`date +%s`.tgz   //声明变量引用时间戳
tar zcf $TARFILE $* &> /dev/null    /将备份的文件压缩命名
echo "已执行 $0 脚本,"
echo "共完成 $# 个对象的备份" 
echo "具体内容包括: $*"
[root@localhost ~]# chmod +x mybak.sh
[root@localhost ~]# ./mybak.sh /boot/grub       //备份一个对象的情况
已执行 ./mybak.sh 脚本,
共完成 1 个对象的备份
具体包括:/boot/grub
[root@localhost ~]# ./mybak.sh /etc/passwd /etc/shadow     //备份两个对象的情况
已执行 ./mybak.sh 脚本, 
共完成 2 个对象的备份
具体包括:/etc/passwd /etc/shadow
[root@localhost ~]# ls -lh beifen-*	          //确认备份结果
-rw-r--r--. 1 root root 368 Jul 4 09:37 beifen-1499175456.tgz
-rw-r--r--. 1 root root 1.8K Jul 4 09:37 beifen-1499175464.tgz

Supongo que te gusta

Origin blog.csdn.net/wulimingde/article/details/108071594
Recomendado
Clasificación