Red de conocimiento informático - Problemas con los teléfonos móviles - La programación de Shell es difícil

La programación de Shell es difícil

I. Corchetes, corchetes redondos ()

1, corchetes simples ()

(1) grupo de comandos. Los comandos entre paréntesis se ejecutarán en una nueva secuencia de subcapa, por lo que el resto del script no podrá utilizar las variables entre paréntesis. Varios comandos entre paréntesis están separados por punto y coma. El último comando puede no tener punto y coma. No es necesario dejar un espacio entre el comando y el paréntesis.

②Reemplazo de comando. Equivalente a 'cmd', el shell escanea la línea de comando una vez, encuentra la estructura de $(cmd), luego ejecuta cmd en $(cmd) una vez, obtiene su salida estándar y luego coloca esta salida en el comando original. Algunos shells no lo admiten, como tcsh.

③ Se utiliza para inicializar la matriz. Por ejemplo, matriz = (a b c d)

2. Corchetes dobles ((?))

①Expansión de enteros. Este cálculo extendido es un cálculo de números enteros y no admite cálculos de punto flotante. La estructura ((exp)) expande y evalúa una expresión aritmética. Si la expresión se evalúa como 0, el código de estado de salida devuelto es 1 o "falso", mientras que una expresión con valor distinto de cero devuelve un código de estado de salida de 0 o "verdadero". Si es un juicio lógico, la expresión exp es 1 si es verdadera y 0 si es falsa.

②Los operadores y expresiones entre paréntesis se pueden usar en $((exp)), o incluso en el operador de tres registros, siempre que cumplan con las reglas de operación del lenguaje C. Al realizar diferentes operaciones de acarreo (como binarias, octales y hexadecimales), todos los resultados de salida se convierten automáticamente a decimales. Por ejemplo, el resultado de echo $((16#5f)) es 95 (16 en decimal).

③Simplemente use (()) para redefinir valores de variables, como a = 5 ((a++)) para redefinir $a a 6.

④Las variables entre corchetes dobles no pueden llevar el símbolo $ como prefijo. Varias expresiones entre paréntesis se pueden separar con comas.

¿Y si? ($ i & lt5)

¿Y si? [?$yo? ¿Teniente? 5?]

¿Y si? [?$a? -¿nordeste? 1?-a? $a? ! =?2?]

¿Y si? [?$a? -¿nordeste? 1]?& amperio& amperio? [?$a? ! =?2?]

¿Y si? [[?$a? ! =?1?& amperio& amperio? $a? ! =?2?]]

¿Para qué? ¿I? ¿existir? $(Secuencia?0?4);¿Qué hacer? ¿eco? $I;Hecho

¿Para qué? ¿I? ¿existir? `¿Secuencia? 0?4`;¿Qué hacer? ¿eco? $I;Hecho

¿Para qué? ((I = 0;I<5;i++));¿Qué hacer? ¿eco? $I;Hecho

¿Para qué? ¿I? ¿existir? {0..4};¿Qué hacer? ¿eco? $ I; Completo ii) Corchetes, corchetes []

1, corchetes simples []

(1) ①Comando interno Bash, [es equivalente a prueba. Si no usamos rutas absolutas, generalmente usamos los propios comandos de bash. El corchete izquierdo en la estructura if/test es el identificador de comando para llamar a la prueba, y el corchete derecho es el juicio de la condición de cierre. El comando prueba sus argumentos como expresiones o archivos de comparación y devuelve un código de estado de salida basado en los resultados de la comparación. El corchete de cierre no es necesario en estructuras if/test, pero sí en versiones más nuevas de Bash.

②Los únicos operadores de comparación disponibles en ②Test y [] son ​​== y ! =, ambos se usan para comparar cadenas, no para comparar números enteros. La comparación de enteros solo se puede usar en forma de -eq y -gt. Ni la comparación de cadenas ni la comparación de enteros admiten los signos mayor que y menor que. Si realmente necesita usarlo, puede usar el formato de escape para comparar cadenas. Si compara "ab" y "BC":[AB \

③Rango de caracteres. Se utiliza como parte de una expresión regular para describir el rango de caracteres que deben coincidir. A efectos de prueba, la regularidad no se puede utilizar entre paréntesis.

④En el contexto de una estructura de matriz, los paréntesis se utilizan para representar el número de cada elemento de la matriz.

2. Corchetes dobles [[]]

①[[ es una palabra clave en el lenguaje de programación bash. No es un comando, por lo que la estructura [[]] es más general que la estructura [].

Todos los caracteres entre [[ y ]] no tendrán expansión de nombre de archivo ni segmentación de palabras, pero tendrán expansión de parámetros y sustitución de comandos.

② Admite la coincidencia de patrones de cadenas e incluso admite expresiones regulares de shell cuando se usa el operador = ~. La comparación de cadenas puede tratar el lado derecho como un patrón, no solo una cadena, como [[ hola == infierno? ]], el resultado es verdadero. Haga coincidir una cadena o un carácter comodín en [[]] sin comillas.

③Usar [[...]] condiciones para juzgar estructuras en lugar de [...] puede evitar muchos errores lógicos en los scripts. Por ejemplo, los operadores &, ||, <And> pueden existir en la estructura de juicio condicional [[]] en circunstancias normales, pero si aparecen en la estructura [], se informará un error.

④bash trata la expresión entre corchetes dobles como un solo elemento y devuelve un código de estado de salida.

3) Llaves y llaves {}

1, uso general.

①El stent se expande. (globbing) expandirá el nombre del archivo entre llaves. Dentro de las llaves, no se permiten espacios a menos que estén entrecomillados o con escape. El primero es expandir mediante llaves una lista de archivos separados por comas. Por ejemplo, el resultado de tocar {a, b}. txt es un segundo.txtb.txt, que extiende una lista secuencial de archivos separados por puntos (...) colocados entre llaves, como por ejemplo: touch {a..d}. txt, el resultado es a.txtb.txtc.txtd.txt.

bogon:/home/bash? #?ls? {ex1, ex2}. Shh

ex1.shex2.sh

bogon:/home/bash? #?ls? {Por ejemplo {1..3}, ej4}. Shh

ex1.shex2.shex3.shex4.sh

bogon:/home/bash? #?ls? {ej[1-3], ej4}. Shh

EX1. SHEX2. SHEX3. SHEX4. ¿Los bloques de código SH2, también llamados grupos internos, realmente crean funciones anónimas? . A diferencia de los comandos entre paréntesis, los comandos entre paréntesis no abren un nuevo subshell para ejecutar, es decir, las variables entre paréntesis todavía están disponibles para el resto del script. Los comandos entre paréntesis están separados por punto y coma y el último comando también debe tener un punto y coma. Debe haber un espacio entre el primer comando de {} y el corchete de apertura.

2) Varias estructuras alternativas especiales: ${var:-string}, ${var:+string}, ${var: = string}, ${var:? Cadena}

? a. ${var:-string} y ${var:=string}: si la variable var está vacía, reemplace ${var:-string} en la línea de comando con una cadena; de lo contrario, si la variable var no está vacía, luego Reemplace ${ var:-string } con el valor de la variable var; las reglas de reemplazo para ${ var:= string } son las mismas que ${ var:-string }, pero la diferencia es que si ${ var:= string } está vacío. Luego reemplace ${ var:= string } con string y asigne string a la variable var:${ var:= string }. Un uso común es determinar un valor determinado.

? B. La regla de reemplazo de ${var:+string} es opuesta a la anterior, es decir, la cadena se reemplaza solo cuando var no está vacía. Cuando var está vacía, el valor de la variable var no se reemplaza ni se reemplaza, es decir. , el valor nulo. Debido a que la variable var está vacía en este momento, ¿son equivalentes estas dos declaraciones?

? c,${var:? La regla de reemplazo de String} es: si la variable var no está vacía, reemplace ${var:? string }; Si la variable var está vacía, la cadena se enviará al error estándar y saldrá del script. Podemos utilizar esta función para comprobar si el valor de una variable está establecido.

? Expansión complementaria: entre las cinco estructuras alternativas anteriores, la cadena no es necesariamente una constante y se puede utilizar el valor de otra variable o la salida de un comando.

3) Cuatro estructuras de reemplazo de coincidencia de patrones: $ {var% patrón}, $ {var%% patrón}, $ {var # patrón}, $ {var # # patrón}

? El primer patrón: ${variable%pattern}. En este modo, el shell busca en la variable para ver si termina con el patrón dado. Si es así, elimina el contenido de la variable de la línea de comando y elimina el patrón coincidente más corto a la derecha.

? El segundo patrón: ${variable%%pattern}. En este modo, el shell busca en la variable para ver si termina con el patrón dado. Si es así, elimina el patrón coincidente más largo a la derecha de la línea de comando.

? Tercer modo: ${variable#pattern} En este modo, el shell busca si la variable comienza con el patrón dado y, de ser así, elimina el contenido de la variable de la línea de comando y elimina el patrón coincidente más corto a la izquierda. .

? El cuarto modo: ${variable##pattern} En este modo, el shell busca la variable para ver si termina con el patrón dado. Si es así, elimina el patrón coincidente más largo a la derecha de la línea de comando.

? El valor de la variable no cambiará en estos cuatro modos, entre los cuales % y %%, # y # # solo difieren cuando se usa el símbolo coincidente * en el modo. Los patrones en las estructuras admiten comodines y * representa cero o más caracteres arbitrarios. significa cero o cualquier carácter, [...] significa hacer coincidir los caracteres entre paréntesis, [! ...] significa que los caracteres entre paréntesis no coinciden.

bogon:/home/bash? #?var =Caso de prueba

bogon:/home/bash? #?¿eco? $var

Caso de prueba

bogon:/home/bash? #?¿eco? ${var%s*e}

testca

bogon:/home/bash? #?¿eco? $var

Caso de prueba

bogon:/home/bash? #?¿eco? ${var%%s*e}

La séptima nota de la escala mayor

bogon:/home/bash? #?¿eco? ${var#? e}

Caso

bogon:/home/bash? #?¿eco? ${var##? e}

Caso

bogon:/home/bash? #?¿eco? ${var##*e}

bogon:/home/bash? #?¿eco? ${var##*s}

e

bogon:/home/bash? #?¿eco? ${var##test}

Situación