Le tutoriel détaillé de Linux Shell le plus complet

1. Préparation de l'environnement

Nous sommes là pour tester et apprendre en local, donc je ne vous conseille pas de vous précipiter pour acheter un serveur pour apprendre, cela reviendra plus cher. Après avoir appris ces bases, nous commencerons à utiliser le serveur, ce sera facile. Outil d'apprentissage local : machine virtuelle Si vous ne disposez pas de cet outil, veuillez l'installer comme suit : Tutoriel d'installation et de configuration de la machine virtuelle  Bien sûr, si vous avez de l'argent, vous pouvez également en louer un auprès d'Alibaba Cloud ou de Tencent Cloud.

Deux, bonjour Linux

Créez un script shell, nommez-le test et formatez-le en .sh

touch test.sh

Modifier le script :

vim test.sh

Si vous ne savez pas comment utiliser vim, ou si vim n'est pas installé sur votre machine virtuelle, lisez la partie précédente de cet article : didacticiel détaillé cat Au fait, vous pouvez également apprendre la commande cat. Voici une démonstration approximative : Entrez d'abord la commande suivante et appuyez sur Entrée

vim test.sh

Appuyez sur la touche lettre i pour éditer, je vais entrer bonjour Linux, vous pouvez également écrire d'autres contenus, pas nécessairement en anglais

Après avoir modifié le contenu, appuyez sur la touche ÉCHAP, puis saisissez : wq ! (signifiant l'enregistrement et la sortie forcés), puis appuyez sur Entrée.

Comme ci-dessus, la sauvegarde est réussie.

3. Exécutez le script shell

Première autorisation d'accord :

chmod 777 test.sh

Exécutez le script :

./test.sh

Démo :

Quatre, variables shell

1) Variables ordinaires

Les variables sont très simples. Par exemple, si je veux attribuer la valeur "Chuan Chuan beau mec" à la variable a, c'est :

a="川川帅哥"

Qu'en est-il de l'utilisation de variables d'impression ?

echo $a

Vous pouvez comprendre echo ici comme print de python, printf du langage c, etc.

Maintenant, nous créons toujours un nouveau sh à tester

touch test1.sh

modifier le fichier :

vim test1.sh

Le contenu édité est le suivant :

L'interface de fonctionnement est la suivante :

Comme vous pouvez le voir, j'ai commencé à oublier de donner les autorisations de fichier, donc quand je l'exécute, cela montre que les autorisations ne suffisent pas. Alors n'oubliez pas de donner la permission.

2) Variables en lecture seule

Utilisez la commande readonly pour définir une variable en tant que variable en lecture seule, et la valeur de la variable en lecture seule ne peut pas être modifiée. Par exemple. Créez un nouveau fichier et modifiez :

Le contenu édité est le suivant :

L'exécution signalera une erreur :

En fait, on utilise généralement peu ces variables, je pense personnellement qu'il suffit de les comprendre.

3) Supprimer la variable

L'utilisation de la fonction unset est la même que l'opération ci-dessus, donc elle ne sera pas démontrée, c'est juste pour la compréhension.

c="川川菜鸟"
unset c
echo $c

L'exécution de l'exemple ci-dessus ne produira aucune sortie.

5. Chaîne de coquille

1) guillemets simples et doubles

Les chaînes peuvent utiliser des guillemets simples, des guillemets doubles ou aucun guillemet. Créez du contenu en tant que :

a='川川菜鳥'
b="川川帥哥"
echo $a
echo $b

Démo :

Démo complète :

Fonctionnalités de citation unique :

  • Tous les caractères entre guillemets simples seront affichés tels quels et les variables entre guillemets simples ne sont pas valides ;
  • Un guillemet simple ne peut pas apparaître dans une chaîne de guillemets simples (même après avoir utilisé un caractère d'échappement pour le guillemet simple), mais il peut apparaître par paires et utilisé comme concaténation de chaînes.

Caractéristiques des guillemets :  - Il peut y avoir des variables entre guillemets - Des caractères d'échappement peuvent apparaître entre guillemets

2) Concaténation de chaînes

a="chuan"
b="chuan"
c=" $a$b"
echo $c

comme suit:

La démo complète est la suivante :

3) Obtenez la longueur de la chaîne

Ajoutez echo ${#c} en plus de ce qui précède :

a="chuan"
b="chuan"
c=" $a$b"
echo $c
echo ${#c}

Démo complète :

4) Extraction de chaîne

On peut rajouter un peu plus sur la base précédente, on utilise principalement la méthode du slicing pour l'obtenir. Si vous avez appris le python avec moi, alors vous ne le savez pas, donc je ne l'expliquerai pas. Modifiez et enregistrez le contenu comme suit

a="chuan"
b="chuan"
c=" $a$b"
echo $c
echo ${#c}
echo ${a:1:3}

Tout de suite:

Démo complète :

6. Tableau Shell

1) Lire le tableau d'index

Les tableaux Shell sont représentés par des parenthèses et les éléments sont séparés par des symboles d'espace. Le contenu du fichier sh est :

a=(A B "C" D)
echo $a

Tout de suite

La démo complète est :

Mais vous demandez-vous si vous n'affichez que le premier ? Dans le shell, nous ne pouvons pas tous les afficher directement comme les autres langages, nous devons donc le modifier. Changez-le en ceci :

a=(A B "C" D)
echo ${a[0]}
echo ${a[1]}
echo ${a[2]}
echo ${a[3]}

Enregistrez et exécutez à nouveau :

2) Obtenir tous les éléments du tableau

Que se passe-t-il si vous voulez tout sortir en même temps, mais que vous ne voulez pas sortir via l'index ? Utilisez @ ou * pour obtenir tous les éléments du tableau. Sur la base de ce qui précède, je vais modifier et ajouter deux lignes :

a=(A B "C" D)
echo ${a[0]}
echo ${a[1]}
echo ${a[2]}
echo ${a[3]}
echo "數組元素依次如下:${a[@]}"
echo "數組元素依次如下:${a[*]}"

Démo complète :

3) Obtenir la longueur du tableau

Ajouter à la base précédente :

echo "數組元素個數爲:${#a[@]}"
echo "數組元素個數爲:${#a[*]}"

Tout de suite

La démonstration est la suivante :

Seven, opérateur shell

opérateur arithmétique

Démontrant certains d'entre eux, d'autres sont similaires:

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 démo complète est la suivante :

Précautions:

  • Il doit y avoir des espaces entre les expressions et les opérateurs, par exemple, 2+2 est faux et doit être écrit comme 2 + 2, ce qui est différent de la plupart des langages de programmation que nous connaissons.
  • L'expression complète doit être entourée de deux backticks. Notez que ce caractère n'est pas un guillemet simple couramment utilisé, il se trouve sous la touche Esc.
  • Le signe de multiplication (*) doit être précédé d'une barre oblique inverse () pour obtenir la multiplication ;
  • if...then...fi est une instruction conditionnelle, qui sera expliquée plus tard.

Je ne parlerai pas des autres opérateurs, mais principalement des opérateurs arithmétiques maîtrisés.

8. Commande d'écho du shell

Vous pouvez tester l'apprentissage en entrant une telle commande d'une ligne directement dans le terminal, sans avoir à créer de nouveaux fichiers tout le temps.

1) Afficher la chaîne normale

echo "hello world"

Les guillemets doubles ici peuvent être complètement omis, et les commandes suivantes ont le même effet que l'exemple ci-dessus :

echo hello world

La démo complète est la suivante :

2) Afficher les caractères d'échappement

echo "\"hello world\""

La démonstration est la suivante :

3) Afficher la nouvelle ligne

Utilisez \n pour les retours à la ligne :

echo -e "hello\n"

La démonstration est la suivante :

4) l'affichage ne s'enroule pas

echo -e "chuan! \c" # -e 开启转义 \c 不换行

Démo :

5) Afficher les résultats redirigés vers le fichier

Dirigé vers le fichier test7.sh :

echo "hello world" >test7.sh

Démo :

6) Afficher le temps d'exécution

echo `date`

Démo :

C'est la fin ici encore, ajoutons que printf a la même fonction que la commande echo, donc je ne vais pas le démontrer, et utiliser echo pour sortir uniformément.

9. Commande de test du shell

1) Test numérique

Les paramètres et les descriptions sont les suivants :

-eq 等于则为真
-ne 不等于则为真
-gt 大于则为真
-ge 大于等于则为真
-lt 小于则为真
-le 小于等于则为真

Démontrez un paramètre comme suit :

num1=200
num2=200
if test $[num1] -eq $[num2]
then
    echo '两个数相等!'
else
    echo '两个数不相等!'
fi

Tout de suite:

La démo complète est la suivante :

À ce stade, je supprime d'abord le fichier créé précédemment :

rm -rf test1.sh test2.sh test3.sh test4.sh test5.sh test6.sh test7.sh test8.sh

Démo :

Les [] dans le code effectuent des opérations arithmétiques de base, par exemple :

a=10
b=10

result=$[a+b] # 注意等号两边不能有空格
echo "result結果为: $result"

La démo complète est la suivante (j'ai créé un nouveau dossier pour ne pas le gâcher):

Je n'ai fait que démontrer l'addition, vous pouvez également essayer d'autres calculs.

2) Test de chaîne

Les paramètres sont les suivants :

=   等于则为真
!=  不相等则为真
-z 字符串  字符串的长度为零则为真
-n 字符串  字符串的长度不为零则为真

La première démo est la suivante :

num1="chuan"
num2="chuan"
if test $num1 = $num2
then
    echo '两个字符串相等!'
else
    echo '两个字符串不相等!'
fi

Tout de suite:

La démo complète est la suivante :

3) Essai de fichier

paramètre:

-e 文件名  如果文件存在则为真
-r 文件名  如果文件存在且可读则为真
-w 文件名  如果文件存在且可写则为真
-x 文件名  如果文件存在且可执行则为真
-s 文件名  如果文件存在且至少有一个字符则为真
-d 文件名  如果文件存在且为目录则为真
-f 文件名  如果文件存在且为普通文件则为真
-c 文件名  如果文件存在且为字符型特殊文件则为真
-b 文件名  如果文件存在且为块特殊文件则为真

Par exemple:

if test -e ./test1.sh
then
    echo '文件已存在!'
else
    echo '文件不存在!'
fi

La démo complète est la suivante :

D'autres paramètres peuvent être testés par eux-mêmes.

Dix, flux de contrôle du shell

1) si pour juger du débit

 La syntaxe de if else fi est la suivante :

if condition
then
    command1 
    command2
    ...
    commandN 
fi

Par exemple:

-gt 大于则为真

Le code de test est le suivant :

a=5
b=6
if test [$a -gt]
then
        echo '大於'
else    
        echo '小於'
fi

La démo complète est la suivante :

Ensuite, le code de test avancé est le suivant :

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 démo complète est la suivante :

2) pour la boucle

grammaire:

for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done

Écrit en une ligne c'est :

for var in item1 item2 ... itemN; do command1; command2… done;

Un exemple est le suivant : afficher séquentiellement les numéros de la liste actuelle

for a in 1 2 3 4 5
do
    echo "值依次爲: $a"
done

La démo complète est la suivante :

Autre exemple : afficher séquentiellement les caractères d'une chaîne

for str in hello chuan chuan
do
    echo $str
done

La démo complète est la suivante :

Allons plus loin : imprimez la table de multiplication de n'importe quel nombre

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 démo complète est la suivante :

3) boucle while

Forme grammaticale :

while condition
do
    command
done

Par exemple : sortie 1 à 6 en séquence

int=1
while(( $int<=6 ))
do
    echo $int
    let "int++"
done

La démo complète est la suivante :

4) jusqu'à la boucle

until Loop exécute une séquence de commandes jusqu'à ce qu'une condition soit vraie et s'arrête. La boucle until est l'exact opposé de la boucle while. La syntaxe est :

until condition
do
    command
done

condition est généralement une expression conditionnelle, si la valeur de retour est fausse, continuez à exécuter l'instruction dans le corps de la boucle, sinon sortez de la boucle. Par exemple : utilisez la commande until pour générer des nombres de 0 à 6

a=0

until [ ! $a -lt 6 ]
do
   echo $a
   a=`expr $a + 1`
done

La démo complète est la suivante :

5)cas ... esac

case ... esac est une instruction à choix multiples, similaire à switch ... case en langage C. Chaque branche case commence par une parenthèse droite et deux points-virgules ; ; indique une pause, c'est-à-dire la fin de l'exécution. La syntaxe est:

case 值 in
模式1)
    command1
    command2
    ...
    commandN
    ;;
模式2)
    command1
    command2
    ...
    commandN
    ;;
esac

Exemple : invite à entrer 1 à 4 pour correspondre à chaque modèle

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 démo complète est la suivante :

6) Sortez de la boucle

break  La commande break permet de sortir de toutes les boucles (terminer l'exécution de toutes les boucles suivantes). Le code de test est le suivant :

do
    echo -n "输入 1 到 5 之间的数字:"
    read aNum
    case $aNum in
        1|2|3|4|5) echo "你输入的数字为 $aNum!"
        ;;
        *) echo "你输入的数字不是 1 到 5 之间的! 游戏结束"
            b

La démo complète est la suivante :

continue  La commande continue est similaire à la commande break, sauf qu'elle n'interrompt pas toutes les boucles, mais uniquement la boucle en cours. Le code d'essai est :

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 démo complète est la suivante :

Est-ce que quelqu'un veut me demander comment ça se termine? Juste ctrl+c pour forcer la fin.

Onze, fonction Shell

Je ne parlerai pas du langage sophistiqué, regardons une fonction de démonstration :

demoFun(){
    echo "測試一下我的函數!"
}
echo "函数开始执行"
demoFun
echo "-函数执行完毕"

Si vous avez appris d'autres langues, vous devez les comprendre d'un coup d'œil. La démo complète est la suivante :

Ici, je vais insérer un autre exemple : lire 10 chiffres au clavier et afficher les valeurs maximale et minimale. Le code est :

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 démo complète est la suivante :

Ce qui suit définit une fonction avec une instruction de retour : Le code est :

add(){
    echo "这个函数为求两个函数之和.."
    echo "输入第一个数字: "
    read aNum
    echo "输入第二个数字: "
    read bNum
    echo "两个数字分别为 $aNum 和 $bNum !"
    return $(($aNum+$bNum))
}
add
echo "输入的两个数字之和为 $? !"

La démo complète est la suivante :

12. Redirection d'entrée/sortie du shell

Les paramètres pertinents sont les suivants :

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 之间的内容作为输入。

Faites quelques exemples :

1) Redirection de sortie

rediriger la sortie vers le dossier wen

Un autre exemple est que je redirige le fichier test16.sh vers le fichier han

L'un des inconvénients d'une telle redirection est qu'elle écrasera le contenu d'origine. Si vous ne souhaitez pas écraser le contenu d'origine, vous pouvez utiliser :

command >> file 将输出以追加的方式重定向到 file。

La démo complète est la suivante :

Nous pouvons donc voir qu'il a été ajouté.

2) Redirection d'entrée

Si vous voulez compter le nombre de lignes dans un dossier :

wc -l wen

Si nous redirigeons l'entrée vers le fichier wen :

wc -l <  wen

Démontré comme :

3)ici le document

Ici, Document est une méthode de redirection spéciale dans Shell, qui est utilisée pour rediriger l'entrée vers un script ou un programme shell interactif. La syntaxe est ;

command << delimiter
    document
delimiter

Par exemple:

wc -l << EOF
   欢迎大家
   这里是川川菜鸟
   教程
EOF

Démo :

Il peut également être exécuté en tant que script :

cat << EOF
    欢迎大家
   这里是川川菜鸟
   教程
EOF

La démonstration est la suivante :

4) /dev/fichier nul

Si vous souhaitez exécuter une commande sans afficher la sortie à l'écran, vous pouvez rediriger la sortie vers /dev/null :

13. Exercices pratiques

1) Exemples Linux

Si vous ne comprenez pas les opérations suivantes, veuillez lire mon article. Après avoir lu cet article, vous comprendrez : cat tutoriel détaillé  redirection d'entrée et de sortie :  ①Créer un nouveau fichier fichier1, entrée : Bonjour, Linux ! Sauvegarder et quitter. Créez un nouveau fichier file2, entrez : World ! Sauvegarder et quitter. Affichez le contenu de file1 et file2 sur le terminal et redirigez vers le fichier file3. Ajoutez le contenu de fichier1 au fichier fichier3.

Étapes de l'opération : 1. Créer un nouveau travail de dossier

mkdir work

2. Changer de répertoire

cd work/

Démo complète :

3. Créer et modifier un nouveau fichier

touch file1

modifier le fichier

vim file1

Afficher les fichiers:

cat file

Démo complète :

4. Créez un autre fichier pour la même raison, la démonstration complète est la suivante :

5. Rediriger vers le fichier file3

cat file1 file2 >>file3

La démo complète est la suivante :

6. Ajouter le contenu de fichier1 au fichier fichier3

cat file1>>file3

La démo complète est la suivante :

②Pipeline : Compter et afficher le nombre de lignes dans lesquelles "hello" apparaît dans le fichier file3

grep Hello file3 |wc -l

La démonstration est la suivante :

③ Pipeline et redirection d'entrée et de sortie : Entrez dans le répertoire /home/student, utilisez le format ls -l long pour répertorier les fichiers et les répertoires sous le répertoire actuel et enregistrez les 5 premières informations dans la liste de fichiers. Créez un nouveau dossier et modifiez list.txt comme suit :

file1
file2
file3
file4
file5
file6
file7

Démo complète :

Vérifiez-le:

Afficher les fichiers et répertoires dans le répertoire courant

ls -al

Démo :

Filtrez les 5 premières données et ajoutez-les au fichier 3 :

ls -l |head -n 5 >>list.txt

La démo complète est la suivante :

2) Exercices de coque

① Créez 50 répertoires dans le répertoire /home, et les noms de répertoire sont : a1, ..., a50 ; Créez un fichier sh :

touch 1.sh

Le contenu est :

i=1

while [ $i -le 50 ]

do

mkdir a$i

i=$((i+1))

done

Démo complète :

② Ecrire un programme, sa fonction est : vérifier d'abord si le nom /root/test/logical existe. S'il n'existe pas, créez un fichier, utilisez le toucher pour le créer et quittez une fois la création terminée ; s'il existe, jugez si le nom est un fichier, s'il s'agit d'un fichier, affichez son numéro de ligne ; s'il est pas un fichier, laissez ; Créer 2.sh

touch 2.sh

Le contenu est :

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 démonstration est la suivante :

Vérifiez-le:

③ Écrivez un script shell, lisez 10 chiffres sur le clavier et affichez les valeurs maximales et minimales

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 démo complète est la suivante :

④ Écrivez un script pour imprimer la table de multiplication de n'importe quel nombre. Par exemple : saisissez 3, puis imprimez 11=1 21=2 22=4 31=3 32=6 33=9 Le code est le suivant :

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 démo complète est la suivante :

Je suppose que tu aimes

Origine blog.csdn.net/u010258235/article/details/131682103
conseillé
Classement