1. Preparación ambiental
Estamos aquí para probar y aprender localmente, por lo que no recomiendo que se apresure a comprar un servidor para aprender, será más costoso. Después de que hayamos aprendido estos conceptos básicos, comenzaremos a usar el servidor, será fácil de comprender. Herramienta de aprendizaje local: máquina virtual Si no tiene esta herramienta, instálela de la siguiente manera: tutorial de instalación y configuración de la máquina virtual Por supuesto, si tiene dinero, también puede alquilar una de Alibaba Cloud o Tencent Cloud.
Dos, hola Linux
Cree un script de shell, asígnele el nombre de prueba y formatéelo como .sh
touch test.sh
Editar guión:
vim test.sh
Si no sabe cómo usar vim, o su máquina virtual no tiene vim instalado, lea la parte anterior de este artículo: tutorial detallado de cat Por cierto, también puede aprender el comando cat. Aquí hay una demostración aproximada: primero ingrese el siguiente comando y presione Enter
vim test.sh
Presione la tecla de la letra i para editar, ingresaré hello Linux, también puede escribir otro contenido, no necesariamente en inglés
Después de editar el contenido, presione la tecla ESC y luego ingrese: wq! (es decir, forzado a guardar y salir), y presione Entrar.
Como arriba, el guardado es exitoso.
3. Ejecute el script de shell
Primer permiso de concesión:
chmod 777 test.sh
Ejecute el script:
./test.sh
Manifestación:
Cuatro, variables de shell
1) Variables ordinarias
Las variables son muy sencillas, por ejemplo, si quiero asignar el valor de "chuan chuan guapo" a la variable a, es:
a="川川帅哥"
¿Qué pasa con el uso de variables de impresión?
echo $a
Puede entender eco aquí como la impresión de python, la impresión del lenguaje C y similares.
Ahora todavía creamos un nuevo sh para probar
touch test1.sh
editar archivo:
vim test1.sh
El contenido editado es el siguiente:
La interfaz de operación es la siguiente:
Como puede ver, comencé a olvidarme de darle permisos al archivo, por lo que cuando lo ejecuto, muestra que los permisos no son suficientes. Así que no olvides dar permiso.
2) Variables de solo lectura
Utilice el comando de solo lectura para definir una variable como una variable de solo lectura, y el valor de la variable de solo lectura no se puede cambiar. Por ejemplo. Crear nuevo archivo y editar:
El contenido editado es el siguiente:
La ejecución reportará un error:
De hecho, generalmente no usamos mucho este tipo de variables, personalmente creo que es suficiente para entenderlas.
3) Eliminar la variable
Usar la función unset es lo mismo que la operación anterior, por lo que no se demostrará, es solo para comprender.
c="川川菜鸟"
unset c
echo $c
Ejecutar el ejemplo anterior no producirá ningún resultado.
5. Cuerda de concha
1) comillas simples y dobles
Las cadenas pueden usar comillas simples, comillas dobles o sin comillas. Crear contenido como:
a='川川菜鳥'
b="川川帥哥"
echo $a
echo $b
Manifestación:
demostración completa:
Características de comillas simples:
- Los caracteres entre comillas simples se mostrarán tal como están, y las variables entre comillas simples no son válidas;
- Una sola comilla simple no puede aparecer en una cadena de comillas simples (incluso después de usar un carácter de escape para la comilla simple), pero puede aparecer en pares y usarse como una concatenación de cadenas.
Características de las comillas dobles: - Puede haber variables entre comillas dobles - Los caracteres de escape pueden aparecer entre comillas dobles
2) Concatenación de cadenas
a="chuan"
b="chuan"
c=" $a$b"
echo $c
como sigue:
La demostración completa es la siguiente:
3) Obtenga la longitud de la cadena
Agrega echo ${#c} encima de lo anterior:
a="chuan"
b="chuan"
c=" $a$b"
echo $c
echo ${#c}
demostración completa:
4) extracción de cuerdas
Podemos añadir un poco más sobre la base anterior, utilizamos principalmente el método de slicing para obtenerlo ¿Qué es slicing? Si has aprendido Python conmigo, entonces no lo sabes, así que no te lo explicaré. Edite y guarde el contenido de la siguiente manera
a="chuan"
b="chuan"
c=" $a$b"
echo $c
echo ${#c}
echo ${a:1:3}
Ahora mismo:
demostración completa:
6. Matriz de conchas
1) Leer la matriz de índice
Las matrices de shell se representan entre paréntesis y los elementos se separan mediante símbolos de espacio. El contenido del archivo sh es:
a=(A B "C" D)
echo $a
Ahora mismo
La demostración completa es:
Pero, ¿te preguntas si solo generas el primero? En el shell, no podemos generarlos todos directamente como en otros idiomas, por lo que debemos modificarlo. Cámbialo por esto:
a=(A B "C" D)
echo ${a[0]}
echo ${a[1]}
echo ${a[2]}
echo ${a[3]}
Guardar y ejecutar de nuevo:
2) Obtenga todos los elementos en la matriz
¿Qué sucede si desea generar todo a la vez, pero no desea generar a través del índice? Use @ o * para obtener todos los elementos en la matriz. Sobre la base de lo anterior, editaré y agregaré dos líneas:
a=(A B "C" D)
echo ${a[0]}
echo ${a[1]}
echo ${a[2]}
echo ${a[3]}
echo "數組元素依次如下:${a[@]}"
echo "數組元素依次如下:${a[*]}"
demostración completa:
3) Obtenga la longitud de la matriz
Añadir a la base anterior:
echo "數組元素個數爲:${#a[@]}"
echo "數組元素個數爲:${#a[*]}"
Ahora mismo
La demostración es la siguiente:
Siete, operador shell
operador aritmético
Demostrando algunos de ellos, otros son similares:
a=10
b=20
val=`expr $a + $b`
echo "a + b : $val"
val=`expr $a - $b`
echo "a - b : $val"
val=`expr $a \* $b`
echo "a * b : $val"
val=`expr $b / $a`
echo "b / a : $val"
val=`expr $b % $a`
echo "b % a : $val"
if [ $a == $b ]
then
echo "a 等于 b"
fi
if [ $a != $b ]
then
echo "a 不等于 b"
fi
La demostración completa es la siguiente:
Precauciones:
- Debe haber espacios entre expresiones y operadores, por ejemplo, 2+2 es incorrecto y debe escribirse como 2+2, que es diferente de la mayoría de los lenguajes de programación con los que estamos familiarizados.
- La expresión completa debe estar encerrada entre dos comillas invertidas. Tenga en cuenta que este carácter no es una comilla simple de uso común, está debajo de la tecla Esc.
- El signo de multiplicación (*) debe estar precedido por una barra invertida () para lograr la multiplicación;
- if...then...fi es una declaración condicional, que se explicará más adelante.
No hablaré de otros operadores, sino principalmente de operadores aritméticos maestros.
8. Comando de eco de shell
Puede probar el aprendizaje ingresando dicho comando de una línea directamente en la terminal, sin tener que crear nuevos archivos todo el tiempo.
1) Mostrar cadena normal
echo "hello world"
Las comillas dobles aquí se pueden omitir por completo, y los siguientes comandos tienen el mismo efecto que el ejemplo anterior:
echo hello world
La demostración completa es la siguiente:
2) Mostrar caracteres de escape
echo "\"hello world\""
La demostración es la siguiente:
3) Mostrar nueva línea
Utilice \n para saltos de línea:
echo -e "hello\n"
La demostración es la siguiente:
4) la pantalla no se envuelve
echo -e "chuan! \c" # -e 开启转义 \c 不换行
Manifestación:
5) Mostrar resultados redirigidos al archivo
Dirigido al archivo test7.sh:
echo "hello world" >test7.sh
Manifestación:
6) Mostrar el tiempo de ejecución
echo `date`
Manifestación:
Es el final aquí nuevamente, agreguemos que printf tiene la misma función que el comando echo, por lo que no lo demostraré y usaré echo para generar una salida uniforme.
9. Comando de prueba de carcasa
1) Prueba numérica
Los parámetros y descripciones son los siguientes:
-eq 等于则为真
-ne 不等于则为真
-gt 大于则为真
-ge 大于等于则为真
-lt 小于则为真
-le 小于等于则为真
Demostrar un parámetro de la siguiente manera:
num1=200
num2=200
if test $[num1] -eq $[num2]
then
echo '两个数相等!'
else
echo '两个数不相等!'
fi
Ahora mismo:
La demostración completa es la siguiente:
En este punto, primero elimino el archivo creado anteriormente:
rm -rf test1.sh test2.sh test3.sh test4.sh test5.sh test6.sh test7.sh test8.sh
Manifestación:
El [] en el código realiza operaciones aritméticas básicas, por ejemplo:
a=10
b=10
result=$[a+b] # 注意等号两边不能有空格
echo "result結果为: $result"
La demostración completa es la siguiente (creé una nueva carpeta para no estropearla):
Solo demostré la suma, también puedes probar algunos otros cálculos.
2) Prueba de cuerdas
Los parámetros son los siguientes:
= 等于则为真
!= 不相等则为真
-z 字符串 字符串的长度为零则为真
-n 字符串 字符串的长度不为零则为真
La demostración uno es la siguiente:
num1="chuan"
num2="chuan"
if test $num1 = $num2
then
echo '两个字符串相等!'
else
echo '两个字符串不相等!'
fi
Ahora mismo:
La demostración completa es la siguiente:
3) Prueba de archivo
parámetro:
-e 文件名 如果文件存在则为真
-r 文件名 如果文件存在且可读则为真
-w 文件名 如果文件存在且可写则为真
-x 文件名 如果文件存在且可执行则为真
-s 文件名 如果文件存在且至少有一个字符则为真
-d 文件名 如果文件存在且为目录则为真
-f 文件名 如果文件存在且为普通文件则为真
-c 文件名 如果文件存在且为字符型特殊文件则为真
-b 文件名 如果文件存在且为块特殊文件则为真
Como ejemplo:
if test -e ./test1.sh
then
echo '文件已存在!'
else
echo '文件不存在!'
fi
La demostración completa es la siguiente:
Otros parámetros pueden probarse por sí mismos.
Diez, flujo de control de shell
1) si para juzgar el flujo
La sintaxis de if else fi es la siguiente:
if condition
then
command1
command2
...
commandN
fi
Por ejemplo:
-gt 大于则为真
El código de prueba es el siguiente:
a=5
b=6
if test [$a -gt]
then
echo '大於'
else
echo '小於'
fi
La demostración completa es la siguiente:
Entonces el código de prueba avanzado es el siguiente:
a=5
b=6
if test [$a==$b]
then
echo '等於'
elif [ $a -gt $b ]
then
echo "a 大于 b"
elif [ $a -lt $b ]
then
echo "a 小于 b"
else
echo "没有符合的条件"
fi
La demostración completa es la siguiente:
2) para bucle
gramática:
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
Escrito en una línea es:
for var in item1 item2 ... itemN; do command1; command2… done;
Un ejemplo es el siguiente: salida secuencial de los números en la lista actual
for a in 1 2 3 4 5
do
echo "值依次爲: $a"
done
La demostración completa es la siguiente:
Otro ejemplo: salida secuencial de caracteres en una cadena
for str in hello chuan chuan
do
echo $str
done
La demostración completa es la siguiente:
Vamos más allá: imprime la tabla de multiplicar de cualquier número
echo "输入一个数:"
read num
for (( i=1;i<=$num;i++ ))
do
for (( j=1;j<=$num;j++ ))
do
[ $j -le $i ] && echo -n "${i}*${j}=$((i*j)) " #判断j是否小于i,当
j大于i时不输出,输出不换行,末尾加一个制表符
done
echo "" #输出一个换行符
done
La demostración completa es la siguiente:
3) mientras bucle
Formato de gramática:
while condition
do
command
done
Por ejemplo: salida 1 a 6 en secuencia
int=1
while(( $int<=6 ))
do
echo $int
let "int++"
done
La demostración completa es la siguiente:
4) hasta bucle
hasta que Loop ejecuta una secuencia de comandos hasta que se cumple una condición y se detiene. El bucle till es exactamente lo contrario del bucle while. La sintaxis es:
until condition
do
command
done
condition es generalmente una expresión condicional, si el valor de retorno es falso, continúe ejecutando la declaración en el cuerpo del ciclo, de lo contrario salte fuera del ciclo. Por ejemplo: use el comando till para generar números del 0 al 6
a=0
until [ ! $a -lt 6 ]
do
echo $a
a=`expr $a + 1`
done
La demostración completa es la siguiente:
5)caso... esac
case ... esac es una declaración de opción múltiple, similar a switch ... case en lenguaje C. Cada rama de caso comienza con un paréntesis derecho y usa dos puntos y comas para indicar un descanso, es decir, el final de la ejecución. la sintaxis es:
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac
Ejemplo: solicitud para ingresar de 1 a 4 para que coincida con cada patrón
echo '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
read a
case $a in
1) echo '你选择了 1'
;;
2) echo '你选择了 2'
;;
3) echo '你选择了 3'
;;
4) echo '你选择了 4'
;;
*) echo '你没有输入 1 到 4 之间的数字'
;;
esac
La demostración completa es la siguiente:
6) Sal del bucle
break El comando break permite salir de todos los bucles (finalizar la ejecución de todos los bucles subsiguientes). El código de prueba es el siguiente:
do
echo -n "输入 1 到 5 之间的数字:"
read aNum
case $aNum in
1|2|3|4|5) echo "你输入的数字为 $aNum!"
;;
*) echo "你输入的数字不是 1 到 5 之间的! 游戏结束"
b
La demostración completa es la siguiente:
continuar El comando continuar es similar al comando romper, excepto que no rompe todos los bucles, solo el bucle actual. El código de prueba es:
while :
do
echo -n "输入 1 到 5 之间的数字: "
read aNum
case $aNum in
1|2|3|4|5) echo "你输入的数字为 $aNum!"
;;
*) echo "你输入的数字不是 1 到 5 之间的!"
continue
echo "游戏结束"
;;
esac
done
La demostración completa es la siguiente:
¿Alguien quiere preguntarme cómo termina? Simplemente ctrl+c para forzar el final.
Once, Función Shell
No hablaré sobre el lenguaje elegante, veamos una función de demostración:
demoFun(){
echo "測試一下我的函數!"
}
echo "函数开始执行"
demoFun
echo "-函数执行完毕"
Si has aprendido otros idiomas, debes entenderlos de un vistazo. La demostración completa es la siguiente:
Aquí insertaré otro ejemplo: lea 10 números del teclado y muestre los valores máximo y mínimo. El código es:
printf "请输入十个数字: "
read
biggest=$(echo "$REPLY" | tr ' ' '\n' | sort -rn | head -n1)
smallest=$(echo "$REPLY" | tr ' ' '\n' | sort -rn | tail -n1)
echo "最大的数字为: $biggest"
echo "最小的数字为: $smallest"
La demostración completa es la siguiente:
Lo siguiente define una función con una declaración de retorno: El código es:
add(){
echo "这个函数为求两个函数之和.."
echo "输入第一个数字: "
read aNum
echo "输入第二个数字: "
read bNum
echo "两个数字分别为 $aNum 和 $bNum !"
return $(($aNum+$bNum))
}
add
echo "输入的两个数字之和为 $? !"
La demostración completa es la siguiente:
12. Redirección de entrada/salida de shell
Los parámetros relevantes son los siguientes:
command > file 将输出重定向到 file。
command < file 将输入重定向到 file。
command >> file 将输出以追加的方式重定向到 file。
n > file 将文件描述符为 n 的文件重定向到 file。
n >> file 将文件描述符为 n 的文件以追加的方式重定向到 file。
n >& m 将输出文件 m 和 n 合并。
n <& m 将输入文件 m 和 n 合并。
<< tag 将开始标记 tag 和结束标记 tag 之间的内容作为输入。
Haz algunos ejemplos:
1) Redirección de salida
redirigir la salida a la carpeta wen
Otro ejemplo es que redirijo el archivo test16.sh al archivo han
Una desventaja de dicha redirección es que sobrescribirá el contenido original. Si no desea sobrescribir el contenido original, puede usar:
command >> file 将输出以追加的方式重定向到 file。
La demostración completa es la siguiente:
Entonces podemos ver que se ha agregado.
2) Redirección de entrada
Si desea contar cuántas líneas hay dentro de una carpeta:
wc -l wen
Si redirigimos la entrada al archivo wen:
wc -l < wen
Demostrado como:
3)Aquí Documento
Here Document es un método de redirección especial en Shell, que se utiliza para redirigir la entrada a un script o programa de shell interactivo. La sintaxis es;
command << delimiter
document
delimiter
Por ejemplo:
wc -l << EOF
欢迎大家
这里是川川菜鸟
教程
EOF
Manifestación:
También se puede ejecutar como un script:
cat << EOF
欢迎大家
这里是川川菜鸟
教程
EOF
La demostración es la siguiente:
4) /dev/archivo nulo
Si desea ejecutar un comando sin mostrar el resultado en la pantalla, puede redirigir el resultado a /dev/null:
13. Ejercicios prácticos
1) ejemplos de Linux
Si no comprende las siguientes operaciones, lea este artículo mío. Después de leer este artículo, comprenderá: cat tutorial detallado redirección de entrada y salida: ① Crear un nuevo archivo file1, entrada: ¡Hola , Linux ! Guardar y Salir. Cree un nuevo archivo file2, ingrese: ¡Mundo! Guardar y Salir. Muestre el contenido del archivo 1 y el archivo 2 en la terminal y redirija al archivo archivo 3. Agregue el contenido del archivo1 al archivo archivo3.
Pasos de la operación: 1. Crear una nueva carpeta de trabajo
mkdir work
2. Cambiar de directorio
cd work/
demostración completa:
3. Crea y edita un nuevo archivo
touch file1
editar archivo
vim file1
Archivos de vista:
cat file
demostración completa:
4. Crea otro archivo por el mismo motivo, la demostración completa es la siguiente:
5. Redirigir al archivo file3
cat file1 file2 >>file3
La demostración completa es la siguiente:
6. Agregue el contenido del archivo1 al archivo archivo3
cat file1>>file3
La demostración completa es la siguiente:
②Pipeline: cuente y muestre el número de líneas en las que aparece "hola" en el archivo file3
grep Hello file3 |wc -l
La demostración es la siguiente:
③Canalización y redirección de entrada y salida: Ingrese al directorio /home/student, use ls -l formato largo para enumerar los archivos y directorios en el directorio actual, y guarde las primeras 5 piezas de información en la lista de archivos. Cree una nueva carpeta y edite list.txt de la siguiente manera:
file1
file2
file3
file4
file5
file6
file7
demostración completa:
Échale un vistazo:
Ver archivos y directorios en el directorio actual
ls -al
Manifestación:
Filtre los 5 datos principales y agréguelos al archivo 3:
ls -l |head -n 5 >>list.txt
La demostración completa es la siguiente:
2) ejercicios de caparazón
① Cree 50 directorios en el directorio /home, y los nombres de los directorios son: a1, ..., a50; Cree un archivo sh:
touch 1.sh
El contenido es:
i=1
while [ $i -le 50 ]
do
mkdir a$i
i=$((i+1))
done
demostración completa:
② Escriba un programa, su función es: primero verifique si existe el nombre /root/test/logical. Si no existe, cree un archivo, use el toque para crearlo y salga después de que se complete la creación; si existe, juzgue si el nombre es un archivo, si es un archivo, muestre su número de línea; si es no es un archivo, deja; Crear 2.sh
touch 2.sh
El contenido es:
if [ ! -e /home/yifan/maying/shell/case5/logical ]
then
touch logical
elif
[ -f /home/yifan/maying/shell/case5/logical ]
then
rm -f /home/yifan/maying/shell/case5/logical && mkdir /home/yifan/maying/shell/case5/logical
elif
[ -d /home/yifan/maying/shell/case5/logical ]
then
rm -r /home/yifan/maying/shell/case5/logical
fi
La demostración es la siguiente:
Échale un vistazo:
③ Escriba un script de shell, lea 10 números del teclado y muestre los valores máximo y mínimo
printf "请输入十个数字: "
read
biggest=$(echo "$REPLY" | tr ' ' '\n' | sort -rn | head -n1)
smallest=$(echo "$REPLY" | tr ' ' '\n' | sort -rn | tail -n1)
echo "最大的数字为: $biggest"
echo "最小的数字为: $smallest"
La demostración completa es la siguiente:
④ Escriba un script para imprimir la tabla de multiplicar de cualquier número. Por ejemplo: ingrese 3, luego imprima 11=1 21=2 22=4 31=3 32=6 33=9 El código es el siguiente:
echo "输入一个数:"
read num
for (( i=1;i<=$num;i++ ))
do
for (( j=1;j<=$num;j++ ))
do
[ $j -le $i ] && echo -n "${i}*${j}=$((i*j)) " #判断j是否小于i,当
j大于i时不输出,输出不换行,末尾加一个制表符
done
echo "" #输出一个换行符
done
La demostración completa es la siguiente: