El tutorial detallado de Linux Shell más completo

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:

Supongo que te gusta

Origin blog.csdn.net/u010258235/article/details/131682103
Recomendado
Clasificación