Programación de Shell desde la comprensión hasta la apertura ① (Resumen de Shell, variables, operadores, juicio condicional)

Descripción general de la carcasa

Shell es un programa escrito en lenguaje C, que es un puente para que los usuarios usen Linux.Shell es tanto un lenguaje de comandos (que puede entenderse como un intérprete de línea de comandos) como un lenguaje de programación.

inserte la descripción de la imagen aquí

Shell se refiere a una aplicación que proporciona una interfaz a través de la cual los usuarios acceden a los servicios del kernel del sistema operativo .

El sh de Ken Thompson es el primer shell de Unix, y Windows Explorer es un shell de GUI típico.

Shell 脚本(shell script), es un programa script escrito para el shell.

Shell y script de shell son dos conceptos diferentes.El shell en la industria generalmente se refiere a script de shell.

Entorno de concha

La programación Shell es lo mismo que la programación JavaScript y php, siempre que haya un editor de texto que pueda escribir código y un intérprete de script que pueda interpretar y ejecutar.

Hay muchos tipos de shells de Linux, los más comunes son:

  • Bourne Shell (/usr/bin/sh o /bin/sh)
  • Bourne Again Shell(/bin/bash)
  • Consola C (/usr/bin/csh)
  • Shell K(/usr/bin/ksh)
  • Shell para raíz (/ sbin / sh)
  • ...

Estamos utilizando Bash aquí, o Bourne Again Shell, que es muy utilizado en el trabajo diario debido a su facilidad de uso y su gratuidad. Al mismo tiempo, Bash también es el shell predeterminado de la mayoría de los sistemas Linux.

En general, las personas no distinguen entre Bourne Shelly Bourne Again Shell, por lo que, como #!/bin/sh, también se puede cambiar a #!/bin/bash.

[root@hadoop101 bin]$ ll | grep bash
-rwxr-xr-x. 1 root root 941880 5 月 11 2016 bash
lrwxrwxrwx. 1 root root 4 5 月 27 2017 sh -> bash

#!Le dice al sistema que el programa especificado por la siguiente ruta es el programa shell que interpreta el archivo de script.

Introducción a las secuencias de comandos de Shell

Requisitos: Cree un script de Shell que genere helloworld

Abra un editor de texto (puede usar el comando vi/vim para crear un archivo), cree un nuevo archivo test.sh con la extensión sh (sh significa shell), la extensión no afecta la ejecución del script, es es bueno saber el nombre , si usa php para escribir scripts de shell y usa php para la extensión.

Ingrese algún código, la primera línea generalmente es así:

#!/bin/bash
echo "Hello World !"

Métodos comunes de ejecución de scripts:

  • La primera: usa la ruta relativa o la ruta absoluta del script bash o sh+ (sin darle permiso al script +x)
  • La segunda: ejecutar el script con la ruta absoluta o la ruta relativa del script de entrada (debe tener permiso de ejecución +x)

La primera: usa la ruta relativa o la ruta absoluta del script bash o sh+ (sin darle permiso al script +x)

ruta relativa al script sh+

[root@hadoop101 shells]$ sh ./helloworld.sh
Helloworld

Ruta absoluta al script sh+

[root@hadoop101 shells]$ sh /home/root/shells/helloworld.sh
helloworld

Ruta relativa a bash+script

[root@hadoop101 shells]$ bash ./helloworld.sh
Helloworld

Ruta absoluta al script bash+

[root@hadoop101 shells]$ bash /home/root/shells/helloworld.sh
Helloworld

La segunda: ejecutar el script con la ruta absoluta o la ruta relativa del script de entrada (debe tener permiso de ejecución +x)

①Primero, otorgue permiso +x al script helloworld.sh

[root@hadoop101 shells]$ chmod +x helloworld.sh

②Ejecutar el script

camino relativo

[root@hadoop101 shells]$ ./helloworld.sh
Helloworld

camino absoluto

[root@hadoop101 shells]$ /home/root/shells/helloworld.sh
Helloworld

inserte la descripción de la imagen aquí

Nota: el primer método de ejecución es esencialmente que el analizador bash ejecuta el script por usted, por lo que el script en sí no necesita permiso de ejecución. El segundo método de ejecución, la esencia es que el script debe ejecutarse por sí mismo, por lo que necesita permiso de ejecución.

Extensión: el tercer tipo: agregue "." o fuente antes de la ruta del script

①Existen los siguientes guiones

[root@hadoop101 shells]$ cat test.sh
#!/bin/bash
A=5
echo $A

②Use los métodos de , shy respectivamente para ejecutar, y los resultados son los siguientes:bash./.

[root@hadoop101 shells]$ bash test.sh
[root@hadoop101 shells]$ echo $A

[root@hadoop101 shells]$ sh test.sh
[root@hadoop101 shells]$ echo $A

[root@hadoop101 shells]$ ./test.sh
[root@hadoop101 shells]$ echo $A

[root@hadoop101 shells]$ . test.sh
[root@hadoop101 shells]$ echo $A
5

Motivo:
los dos primeros métodos abren una subcapa en la capa actual para ejecutar el contenido del script. Cuando finaliza el contenido de la secuencia de comandos, la subcapa se cierra y vuelve a la capa principal.
El tercer método, es decir, agregar "." o fuente antes de la ruta del script, puede hacer que el contenido del script se ejecute en el shell actual sin abrir un subshell. Es por eso que necesitamos obtenerlo cada vez que modificamos el archivo /etc/profile.
La diferencia entre abrir una subcapa y no abrir una subcapa es que la relación de herencia de las variables de entorno, como la variable actual establecida en la subcapa, es invisible para la capa principal.

Variables de caparazón

Notas sobre el uso de variables

Para usar una variable definida, simplemente prefije el nombre de la variable con un signo de dólar

También podemos encerrar variables entre llaves:
inserte la descripción de la imagen aquí

Las llaves alrededor del nombre de la variable son opcionales y se pueden agregar o no. Las llaves se agregan para ayudar al intérprete a reconocer los límites de la variable.Se recomiendan llaves para todas las variables, lo cual es una buena práctica de programación.

Variables predefinidas del sistema

Variables comunes del sistema

$HOME, $PWD, $SHELL, $USERetc

[root@hadoop101 shells]$ echo $HOME
/home/atguigu 

Podemos mostrar todas las variables en el shell actual: set
inserte la descripción de la imagen aquí

variable personalizada

gramática básica

  • Defina una variable: nombre de variable = valor de variable.Tenga en cuenta que =no puede haber espacios antes y después del número
  • Deshacer variable: variable no establecida
  • Declarar variables estáticas: variables de solo lectura.Nota: no se puede desarmar

Reglas de definición de variables

  • El nombre de la variable puede estar compuesto por letras, números y guiones bajos, pero no puede comenzar con un número. Se recomienda escribir en mayúscula el nombre de la variable de entorno.
  • Sin espacios a ambos lados del signo igual
  • En bash, el tipo predeterminado de variables es el tipo de cadena y las operaciones numéricas no se pueden realizar directamente
  • Si el valor de la variable tiene espacios, debe estar entre comillas dobles o simples

Práctica de casos

(1) Defina la variable A

[root@hadoop101 shells]$ A=5
[root@hadoop101 shells]$ echo $A
5

(2) Reasignar la variable A

[root@hadoop101 shells]$ A=8
[root@hadoop101 shells]$ echo $A
8

(3) Cancelar variable A

[root@hadoop101 shells]$ unset A
[root@hadoop101 shells]$ echo $A

(4) Declarar una variable estática B=2, que no se puede desarmar

[root@hadoop101 shells]$ readonly B=2
[root@hadoop101 shells]$ echo $B
2
[root@hadoop101 shells]$ B=9
-bash: B: readonly variable 

(5) En bash, el tipo predeterminado de variables es el tipo de cadena y las operaciones numéricas no se pueden realizar directamente

[root@hadoop102 ~]$ C=1+2
[root@hadoop102 ~]$ echo $C
1+2

(6) Si el valor de la variable tiene espacios, debe estar entre comillas dobles o comillas simples

[root@hadoop102 ~]$ D=I love banzhang
-bash: world: command not found
[root@hadoop102 ~]$ D="I love banzhang"
[root@hadoop102 ~]$ echo $D
I love banzhang

(7) La variable se puede promover a una variable de entorno global, que puede ser utilizada por otros programas de Shell

export 变量名
[root@hadoop101 shells]$ vim helloworld.sh

Agrega echo $B al archivo helloworld.sh

#!/bin/bash
echo "helloworld"
echo $B
[root@hadoop101 shells]$ ./helloworld.sh
Helloworld

Se encuentra que el valor de la variable B no se imprime.

[root@hadoop101 shells]$ export B
[root@hadoop101 shells]$ ./helloworld.sh
helloworld
2

variable especial

$n

Sintaxis básica:
$n (descripción de la función: n es un número, $0 representa el nombre del script, $1-$9 representa los parámetros primero a noveno, más de diez parámetros, más de diez parámetros deben estar encerrados entre corchetes, como $ {10})

P.ej:

[root@hadoop101 shells]$ touch parameter.sh
[root@hadoop101 shells]$ vim parameter.sh
#!/bin/bash
echo '==========$n=========='
echo $0
echo $1
echo $2
[root@hadoop101 shells]$ chmod 777 parameter.sh
[root@hadoop101 shells]$ ./parameter.sh cls xz
==========$n==========
./parameter.sh
cls
xz

ps

Sintaxis básica :

$# (Descripción de la función: Obtener el número de todos los parámetros de entrada, a menudo utilizados en bucles, para determinar si el número de parámetros es correcto y mejorar la solidez del script).

P.ej:

[root@hadoop101 shells]$ vim parameter.sh
#!/bin/bash
echo '==========$n=========='
echo $0
echo $1
echo $2
echo '==========$#=========='
echo $#
[root@hadoop101 shells]$ chmod 777 parameter.sh
[root@hadoop101 shells]$ ./parameter.sh cls xz
==========$n==========
./parameter.sh
cls
xz
==========$#==========
2

$*, $@

Sintaxis básica :

  • $* (descripción de la función: esta variable representa todos los parámetros en la línea de comando, $* trata todos los parámetros como un todo)
  • $@ (Descripción de la función: esta variable también representa todos los parámetros en la línea de comando, pero $@ trata cada parámetro de manera diferente)

Suponiendo que se escriben tres parámetros 1, 2, 3 cuando se ejecuta el script, " * " es equivalente a "1 2 3" (se pasa un parámetro), y "@" es equivalente a "1" "2" " 3 " (se pasan tres argumentos).

P.ej:

[root@hadoop101 shells]$ vim parameter.sh
#!/bin/bash
echo '==========$n=========='
echo $0
echo $1
echo $2
echo '==========$#=========='
echo $#
echo '==========$*=========='
echo $*
echo '==========$@=========='
echo $@
[root@hadoop101 shells]$ ./parameter.sh a b c d e f g
==========$n==========
./parameter.sh
a
b
==========$#==========
7
==========$*==========
a b c d e f g
==========$@==========
a b c d e f g

ps

Sintaxis básica :
$? (Descripción de la función: el estado de retorno del último comando ejecutado. Si el valor de esta variable es 0, prueba que el comando anterior se ejecutó correctamente; si el valor de esta variable no es 0 (el número específico está determinado por el comando sí mismo), luego demuestre que el comando anterior se ejecutó incorrectamente).

Por ejemplo, juzgamos si el script helloworld.sh se ejecuta correctamente:

[root@hadoop101 shells]$ ./helloworld.sh
hello world
[root@hadoop101 shells]$ echo $?
0

Resumir

inserte la descripción de la imagen aquí

operador

Shell, al igual que otros lenguajes de programación, admite una variedad de operadores, que incluyen:

  • operadores aritméticos
  • operador relacional
  • operador booleano
  • operador de cadena
  • operador de prueba de archivos

Native bash no admite operaciones matemáticas simples, pero se puede lograr a través de otros comandos, como awk y expr, expr es el más utilizado.

expr es una herramienta de evaluación de expresiones que se puede utilizar para evaluar expresiones.

Aquí solo involucramos cuatro operadores simples, se puede ver el uso de otros operadores:
https://www.runoob.com/linux/linux-shell-basic-operators.html

Por ejemplo, usamos expr para sumar dos números:

inserte la descripción de la imagen aquí

Aviso:

  • Tenga en cuenta el uso de acentos graves ` en lugar de comillas simples'
  • Debe haber espacios entre expresiones y operadores, por ejemplo 2+2 es incorrecto, debe escribirse como 2+2, que es diferente de la mayoría de los lenguajes de programación con los que estamos familiarizados.
  • Debe incluirse cuenta que este carácter no es la comilla simple habitual, debajo de la tecla Esc.

La función de los acentos graves es la sustitución de comandos. El contenido de los acentos graves (``) suele ser la línea de comando. El programa ejecutará primero el contenido de los acentos graves y lo reemplazará con el resultado de la ejecución.

También podemos hacerlo de otra forma:

"$((expresión))" o "$[expresión]"

inserte la descripción de la imagen aquí
Más ejemplos:
inserte la descripción de la imagen aquí

A continuación, combinamos los puntos de conocimiento anteriores y ejecutamos un archivo de script para completar la operación de adición:

Primero creamos un script add.sh:
inserte la descripción de la imagen aquí

Luego pasamos los parámetros al ejecutar el script:
inserte la descripción de la imagen aquí

juicio condicional

gramática básica

  • condición de prueba
  • [ condición ](Tenga en cuenta que debe haber espacios antes y después de la condición)

Nota: si la condición no está vacía, es verdadera, [raíz] devuelve verdadero, [] devuelve falso

Condiciones de juicio comunes

  • comparación entre dos números enteros
    • -eq es igual a (igual)
    • -ne no es igual
    • -lt menos que (menor que)
    • -le menor o igual que (menos igual)
    • -gt es mayor que
    • -ge es mayor o igual que (mayor igual)
      Nota: Si se trata de una comparación entre cadenas, use el signo igual "=" para juzgar la igualdad; use "!=" para juzgar la desigualdad.
  • A juzgar por los permisos de archivo
    • -r tiene permiso de lectura (read)
    • -w tiene permiso de escritura (write)
    • -x tiene permiso para ejecutar (ejecutar)
  • A juzgar por el tipo de archivo
    • Archivo existencia (existencia)
    • El archivo existe y es un archivo normal (archivo)
    • El archivo existe y es un directorio.

Práctica de casos

(1) Si 23 es mayor o igual que 22

[root@hadoop101 shells]$ [ 23 -ge 22 ]
[root@hadoop101 shells]$ echo $?
0

(2) ¿Helloworld.sh tiene permiso de escritura?

[root@hadoop101 shells]$ [ -w helloworld.sh ]
[root@hadoop101 shells]$ echo $?
0

(3) Si existe el archivo en el directorio /home/atguigu/cls.txt

[root@hadoop101 shells]$ [ -e /home/atguigu/cls.txt ]
[root@hadoop101 shells]$ echo $?
1

(4) Juicio de condición múltiple (&& significa que el siguiente comando se ejecuta solo cuando el comando anterior se ejecuta con éxito, || significa que el siguiente comando se ejecuta solo después de que el comando anterior no se ejecuta)

[root@hadoop101 ~]$ [ root ] && echo OK || echo notOK
OK
[root@hadoop101 shells]$ [ ] && echo OK || echo notOK
notOK

Supongo que te gusta

Origin blog.csdn.net/zyb18507175502/article/details/127490163
Recomendado
Clasificación