Directorio de artículos
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.
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 Shell
y 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
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 , sh
y 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:
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
, $USER
etc
[root@hadoop101 shells]$ echo $HOME
/home/atguigu
Podemos mostrar todas las variables en el shell actual: set
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
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:
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
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]"
Más ejemplos:
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:
Luego pasamos los parámetros al ejecutar el script:
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