[Guía de programación de Shell] Varios usos de sintaxis de () y {} en Shell


Varios usos gramaticales de () y {} en shell

El prototipo de la variable en Shell: ${var}

Cuando desee mostrar el valor de la variable más caracteres aleatorios (XX), se producirá un error.

En este momento, se debe usar el prototipo de la variable: $ {var}, lo que significa agregar una llave para limitar el alcance del nombre de la variable.

[root@bogon sh]# aa='ajax'
[root@bogon sh]# echo $aa
ajax
[root@bogon sh]# echo $aa_AA

[root@bogon sh]# echo ${aa}_AA
ajax_AA
[root@bogon ~]# file="modify_suffix.sh.tar.gz"
[root@bogon ~]# echo "${file%%.*}"
modify_suffix
[root@bogon ~]# echo "${file%.*}"
modify_suffix.sh.tar
[root@bogon ~]# echo "${file#*.}"
sh.tar.gz
[root@bogon ~]# echo "${file##*.}"

$(cmd)

proceso de ejecución echo $(ls)

El shell escanea la línea de comando, encuentra la estructura $(cmd) y ejecuta el cmd en $(cmd) una vez para obtener su salida estándar.

Luego coloque esta salida en la posición $ (ls) en el comando original echo $ (ls), es decir, reemplace $ (ls) y luego ejecute el comando echo

como sigue:

echo $(ls) se reemplaza por echo 1.txt 2.txt

Lo que se debe tener en cuenta aquí es que la salida de error del comando en $(cmd) no se reemplazará, solo se reemplazará la salida estándar.

[root@bogon t]# ls
1.txt  2.txt
[root@bogon t]# echo $(ls)
1.txt 2.txt

[root@bogon t]# var=$(cat 3.txt)
cat: 3.txt: 没有那个文件或目录
[root@bogon t]# echo $var
#$var显然是空的

Una serie de comandos ejecutados () y {}

() y {} ejecutan una serie de comandos, pero existen diferencias:

Mismo punto:

  1. () y {} ponen una serie de comandos entre paréntesis y los comandos están separados por signos ;

diferencia:

  1. () simplemente vuelve a abrir un subshell para la ejecución de una serie de comandos, y {} ejecuta una serie de comandos en el shell actual.
  2. ()El último comando no necesita punto y coma, {}El último comando requiere punto y coma.
  3. No es necesario que haya un espacio entre el primer comando entre () y el paréntesis izquierdo, y debe haber un espacio entre el primer comando entre {} y el paréntesis izquierdo.
  4. La redirección de un comando dentro de los corchetes () y {} solo afecta a ese comando, pero la redirección fuera de los corchetes afecta a todos los comandos entre corchetes.
######  在{}中 第一个命令和{之间必须有空格,结束必须有;
######  {}中的修改了$var的值 说明在当前shell执行
[root@bogon t]# var=test
[root@bogon t]# echo $var
test
[root@bogon t]# (var=notest;echo $var)
notest
[root@bogon t]# echo $var
test
[root@bogon t]# { var=notest;echo $var;}
notest
[root@bogon t]# echo $var
notest

Varias estructuras de reemplazo especiales.

${var:-string},${var:+string},${var:=string},${var:?string}
  • ${var:-string} y ${var:=string}

Si la variable var está vacía o no está definida, use una cadena para reemplazar ${var:-string} en la línea de comando.

De lo contrario, si la variable var no está vacía, reemplace ${var:-string} con el valor de la variable var.

###### ${var:-string}和${var:=string}
###### 比较 后者发现$var为空时,把string赋值给了var
###### 后者是一种赋值默认值的常见做法
[root@bogon ~]# echo $a

[root@bogon ~]# echo ${a:-bcc}
bcc
[root@bogon ~]# echo $a

[root@bogon ~]# a=ajax
[root@bogon ~]# echo ${a:-bcc}
ajax
[root@bogon ~]# unset a
[root@bogon ~]# echo $a

[root@bogon ~]# echo ${a:=bbc}
bbc
[root@bogon ~]# echo $a
bbc

*** ${var:+cadena}

Las reglas son completamente opuestas a las anteriores**

Es decir, se reemplaza con una cadena solo cuando var no está vacía. Si var está vacía, no se reemplaza ni se reemplaza con el valor de la variable var, es decir, un valor nulo.

[root@bogon ~]# a=ajax
[root@bogon ~]# echo $a
ajax
[root@bogon ~]# echo ${a:+bbc}
bbc
[root@bogon ~]# echo $a
ajax
[root@bogon ~]# unset a
[root@bogon ~]# echo $a

[root@bogon ~]# echo ${a:+bbc}

[root@bogon ~]#

*** ${var:?cadena}

Regla de reemplazo: si la variable var no está vacía, reemplace ${var:?string}** con el valor de la variable var

Si la variable var está vacía, envíe la cadena al error estándar y salga del script.

Puede utilizar esta función para comprobar si el valor de una variable está establecido

[root@bogon ~]# echo $a

[root@bogon ~]# echo ${a:?bbc}
-bash: a: bbc
[root@bogon ~]# a=ajax
[root@bogon ~]# echo ${a:?bbc}
ajax
[root@bogon ~]# a=ajax
[root@bogon ~]# echo ${a:-`date`}
ajax
[root@bogon ~]# unset a
[root@bogon ~]# echo ${a:-`date`}
2017年 02月 21日 星期二 10:13:46 CST
[root@bogon ~]# echo ${a:-$(date)}
2017年 02月 21日 星期二 10:13:59 CST
[root@bogon ~]# b=bbc
[root@bogon ~]# echo ${a:-$b}
bbc

$((exp)) Cálculo extendido estándar POSIX

Este tipo de cálculo es un operador que se ajusta al lenguaje C. Es decir, cualquier operador que se ajuste a C se puede utilizar en $((exp)), incluido el operador ternario.

Nota: Este cálculo extendido es un cálculo de números enteros y no admite tipos de punto flotante, cadenas, etc.

Si es un juicio lógico, la expresión exp es 1 si es verdadera y 0 si es falsa.

[root@bogon ~]# echo $(3+2)
-bash: 3+2: 未找到命令

[root@bogon ~]# echo $((3+2))
5
[root@bogon ~]# echo $((3.5+2))
-bash: 3.5+2: 语法错误: 无效的算术运算符 (错误符号是 ".5+2"[root@bogon ~]# echo $((3>2))
1
[root@bogon ~]# echo $((3>2?'a':'b'))
-bash: 3>2?'a':'b': 语法错误: 期待操作数 (错误符号是 "'a':'b'"[root@bogon ~]# echo $((3>2?a:b))
0
[root@bogon ~]# echo $((a=3+2))
5
[root@bogon ~]# echo $((a++))
5
[root@bogon ~]# echo $a
6

**

Cuatro estructuras de reemplazo de coincidencia de patrones:

Sólo cuando se utilizan comodines en el patrón puede haber la coincidencia más larga y la más corta; de lo contrario, no habrá ninguna coincidencia más larga ni más corta.

El patrón en la estructura admite comodines.

* representa cero o más caracteres arbitrarios


? representa cero o un carácter arbitrario


[…] significa hacer coincidir los caracteres dentro de los corchetes


[!..] significa que los caracteres dentro de los corchetes no coinciden.

**

**

${var%pattern}
${var%%pattern}
${var#pattern}
${var##pattern}

${var%pattern},${var%%pattern} #从右边开始匹配
${var#pattern},${var##pattern} #从左边开始匹配
${var%pattern} ,${var#pattern} #表示最短匹配,匹配到就停止,非贪婪
${var%%pattern},${var##pattern} #是最长匹配

[root@bogon ~]# f=a.tar.gz
[root@bogon ~]# echo ${f##*.}
gz
[root@bogon ~]# echo ${f%%.*}
a
[root@bogon ~]# var=abcdccbbdaa
[root@bogon ~]# echo ${var%%d*}
abc
[root@bogon ~]# echo ${var%d*}
abcdccbb
[root@bogon ~]# echo ${var#*d}
ccbbdaa
[root@bogon ~]# echo ${var##*d}
aa
#发现输出的内容是var去掉pattern的那部分字符串的值

Conclusión: programación, pensamiento y crecimiento continuo.

En el mundo de la programación, cada línea de código es una expresión y cada problema es un desafío. Al igual que los scripts de Bash que hemos explorado en este artículo, el código simple a menudo contiene una gran cantidad de pensamiento y sabiduría para resolver problemas. La programación no es sólo una actividad técnica, sino también un ejercicio de pensamiento y una manifestación de la creatividad humana.

Como dijo Bjarne Stroustrup en "El lenguaje de programación C++": "Programar es el arte de comprender".

Desde una perspectiva de programación, cada error y cada desafío es una oportunidad de crecimiento. Estos "errores" son en realidad un diálogo profundo entre nosotros y la computadora, con el problema e incluso con nosotros mismos. No son sólo problemas, sino también una revelación que nos guía a optimizar nuestro pensamiento y mejorar las soluciones.

Invito sinceramente a todos a unirse a este viaje de programación y pensamiento. Si es nuevo en programación o un desarrollador experimentado, no dude en compartir sus ideas y experiencias. Cada interacción que tienes, ya sea me gusta, comentarios, acciones compartidas o seguidores, es el mayor estímulo y apoyo para seguir creando y compartiendo.

Gracias por tomarse el tiempo de leer este artículo. Si lo encuentra valioso, no olvide marcarlo como favorito y compartirlo. También agradecemos sus valiosas sugerencias y preguntas sobre el contenido del blog, porque cada pregunta puede ser el punto de partida para el siguiente artículo.

Sigamos aprendiendo y creciendo juntos en el camino de la programación.

"El código es como la poesía, la sabiduría es como la luz." —— Desconocido

Gracias por leer y espero volver a encontrarme con usted en la intersección de la programación y el pensamiento.


Lea mi página de inicio de CSDN y desbloquee contenido más interesante: página de inicio de CSDN de Bubble
Insertar descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_21438461/article/details/132930647
Recomendado
Clasificación