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 :