Spécifications et variables de programmation de scripts shell (les règles que les scripts shell doivent connaître!)

Spécifications et variables de programmation de scripts Shell


Shell est un programme d'application spécial, il se situe entre le noyau du système d'exploitation et l'utilisateur, agissant comme un "interpréteur de commandes", chargé de recevoir et d'interpréter les instructions de fonctionnement (commandes) saisies par l'utilisateur, et de passer les opérations qui doivent être exécuté Donne l'exécution du noyau et affiche le résultat de l'exécution. Bash (/ bin / bash) est le shell par défaut utilisé par la plupart des versions de Linux.

1. Présentation du script Shell

1. Le concept de script Shell

1) Enregistrer l'ordre des commandes à exécuter dans un fichier texte
2) Donner au fichier la permission d'exécuter l'exécutable
3) Combiner diverses instructions de contrôle Shell pour effectuer des opérations plus complexes

2. Scénarios d'application des scripts Shell

1) Opérations répétitives
2) Traitement des transactions par lots
3
) Fonctionnement et maintenance automatisés 4) Surveillance de l'état de fonctionnement du service
5) Exécution de la tâche de chronométrage

3. Le rôle de Shell

1) Shell est le tube d'interprétation des commandes, le "traducteur" entre l'utilisateur et le noyau, chargé d'interpréter la saisie en ligne de commande par l'utilisateur.

Insérez la description de l'image ici

2) Shell de connexion de l'utilisateur

  • Programme ShellI utilisé par défaut après la connexion, généralement / bin / bash
  • Les instructions internes et l'environnement d'exploitation des différents Shells seront différents
[root@localhost ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
....

Insérez la description de l'image ici

Deux, écrivez un script shell

1. Ecrire le code de script

● À l'aide de l'éditeur de texte vim,
une commande Linux par ligne, écrite dans l'ordre d'exécution

[root@localhost ~]#vim first.sh #编辑脚本文件,以.sh结尾是方便识别出这是个shell脚本文件
cd /boot/ #切换到根目录
pwd  #查看当前所在目录
ls -lh vml* #以长格式更人性化的方式显示以vml开头的文件

Insérez la description de l'image ici

Le fichier de script first.sh ci-dessus comprend trois commandes: cd / boot /, pwd, ls -lh vml *. Après avoir exécuté ce fichier de script, le résultat de sortie est en fait le résultat de l'exécution de ces trois commandes en séquence, réalisant ainsi un "traitement par lots".

2. Accordez des autorisations exécutables

● Rendre le script exécutable

[root@localhost~]#chmod +x first.sh

Insérez la description de l'image ici

3. Exécutez le fichier de script

1) Méthode 1: La commande pour spécifier le chemin nécessite que le fichier ait l'autorisation x. (Chemin absolu et chemin relatif)

chmod + x /root/first.sh

Spécifiez le chemin absolu: /root/first.sh

Insérez la description de l'image ici

Spécifiez le chemin relatif: ./first.sh

Insérez la description de l'image ici

2) Méthode 2: spécifiez Shell pour interpréter le script, et le fichier ne nécessite pas l'autorisation x.

chemin du script sh: sh first.sh ou sh /root/first.sh

Chemin relatif (doit être dans le répertoire où se trouve le script), ce script est à l'origine créé dans le répertoire personnel (~ répertoire), le répertoire personnel de root est root.

Insérez la description de l'image ici

Chemin absolu (spécifiez directement le chemin spécifique du fichier)

Insérez la description de l'image ici

3) Méthode 3: chemin du script source ou chemin du script (l'autorisation x n'est pas requise)

. first.sh ou source first.sh (comme ci-dessus pour les exigences de chemin)

Insérez la description de l'image ici

Cette méthode d'exécution basculera automatiquement vers le répertoire de démarrage. Ceci est dû au fait que source et. Lisez la configuration du script directement dans le processus en cours et ne démarrera pas un nouveau processus!
Source exécutera le contenu du script directement sur le processus parent (car il n'ouvre pas de nouveau processus, on peut dire qu'il ajoute directement le contenu d'exécution du script au processus courant). Ainsi, après votre source, les variables configurées à l'intérieur seront ajoutées à l'environnement actuel, et vous pouvez appeler les variables dans le script dans le shell!
Et ./first.sh et sh first.sh
sont un nouveau processus de sous-shell pour exécuter ce script sous le processus en cours. Lorsque le script est terminé, les variables définies dans sh et le sous-processus sont détruits ensemble! (Le sous-shell hérite des variables d'environnement du shell de processus parent, et les variables seront détruites à la fin du sous-shell. Si l'exportation est utilisée, les variables du sous-shell peuvent être renvoyées au shell de niveau parent).

4. Composition de script plus complète

  • Instruction de script
  • Informations d'annotation
  • Instruction exécutable
[root@localhost~]#vim /first.sh
#!/bin/bash 
#This is my first Shell-Script. 
cd /boot
echo "当前的目录位于∶" 
pwd
echo "其中以vml开头的文件包括∶"   #输出友好提示信息
ls -Ih vml*

Insérez la description de l'image ici

Dans le fichier de script first.sh ci-dessus, la première ligne "#! / Bin / bash" est une instruction de script spéciale, indiquant que les instructions après cette ligne sont interprétées et exécutées par le programme / bin / bash; les autres instructions commençant par " # "Indique des informations de commentaire; la commande echo est utilisée pour générer des chaînes afin de rendre les informations de sortie du script plus faciles à lire. Par exemple, si le script first.sh réécrit est exécuté, le résultat de sortie est le suivant.

Insérez la description de l'image ici

Quatrièmement, redirection et opération de pipeline

1. Matériel matériel interactif

  • Entrée standard: recevez les données d'entrée utilisateur de l'appareil
  • Sortie standard: sortie des données vers l'utilisateur via l'appareil
  • Erreur standard: signaler les informations d'erreur d'exécution via cet appareil
Types de Fichier de l'appareil Numéro de description du fichier Appareil par défaut
Entrée standard / dev / stdin 0 clavier
Sortie standard / dev / stdout 1 surveiller
Sortie d'erreur standard / dev / stderr 2 surveiller

2. Opération de redirection

Types de Opérateur utilisation
Rediriger l'entrée < Lire les données du fichier spécifié
Rediriger la sortie > Enregistrez le résultat de sortie standard dans le fichier spécifié et écrasez le contenu d'origine
Rediriger la sortie >> Ajouter le résultat de sortie standard à la fin du fichier spécifié sans écraser le contenu d'origine
Sortie d'erreur standard 2> Enregistrez les informations d'erreur dans le fichier spécifié et écrasez le contenu d'origine
Sortie d'erreur standard 2 >> Ajouter le message d'erreur à la fin du fichier spécifié sans écraser le contenu d'origine
Sortie mixte &> Enregistrer la sortie standard et l'erreur standard dans le même fichier
Sortie mixte 2> et 1 Rediriger la sortie d'erreur standard vers la sortie standard

Par exemple:

vim passwd.txt
222222
echo "123456" > passwd.txt
echo "123456" >> passwd.txt

Utilisez> pour afficher le contenu dans le fichier, ce qui écrasera directement le contenu du fichier

Insérez la description de l'image ici

Insérez la description de l'image ici

Utilisez >> pour indiquer ajouter au fichier, cela commencera une nouvelle ligne

Insérez la description de l'image ici

setenforce 0
echo "123456" > passwd.txt
passwd --stdin zs < passwd.txt

Insérez la description de l'image ici

Obtenez le mot de passe dans le fichier pass.txt. Notez que SELinux affectera l'exécution de la commande. Si l'exécution échoue, vous pouvez essayer de le fermer et réessayer.

3. Symbole d'opération de canalisation "|"

Le résultat de sortie de la commande de gauche est utilisé comme entrée (objet de traitement) de la commande de droite. Plusieurs canaux peuvent être utilisés dans la même ligne de commande.

Par exemple:

ps aux | wc -l #显示所有进程数

Insérez la description de l'image ici

echo "abc123" | passwd --stdin zs #更改用户zs的密码为abc123

Insérez la description de l'image ici

Cinq, le rôle et le type des variables Shell

Les variables sont des valeurs qui changeront, et celles qui ne changeront pas sont des constantes

1. Le rôle des variables

Utilisé pour stocker des paramètres spécifiques (valeurs)
que le système et les utilisateurs doivent utiliser. Nom de variable: utiliser un nom fixe, prédéfini par le système ou défini par l'utilisateur.
Valeur de variable: peut changer en fonction des paramètres utilisateur et des modifications de l'environnement système

2. Types de variables

Variables personnalisées: définies, modifiées et utilisées par l'utilisateur.
Variables spéciales: variables d'environnement, variables en lecture seule, variables d'emplacement, variables prédéfinies

3. Variables personnalisées

Définir une nouvelle variable

变量名=变量值    #变量名以字母或下划线开头,区分大小写,建议全大写

Afficher la valeur d'une variable

echo $变量名 #查看当前变量的值

Remarque: il ne peut y avoir aucun espace des deux côtés de "=" lors de l'attribution d'une valeur

Par exemple:

Insérez la description de l'image ici

4. Utilisez des guillemets lors de l'attribution de valeurs

Guillemets doubles: permettent de citer d'autres valeurs de variables via le symbole $

Guillemet simple: il est interdit de citer d'autres valeurs de variable et $ est traité comme un caractère normal

Backtick: remplacement de commande, extraire la sortie après l'exécution de la commande, `` a le même effet que $ (...)

Insérez la description de l'image ici

5. Entrez le contenu du clavier pour attribuer des valeurs aux variables

La commande de lecture obtient l'entrée

read -p 提示信息 变量名
echo $变量名

Insérez la description de l'image ici

Il peut également être utilisé dans des scripts pour collecter des informations.

Par exemple:

Insérez la description de l'image ici

Après avoir accordé l'autorisation d'exécution du script, le résultat de l'exécution est le suivant

Insérez la description de l'image ici

6. La portée de la variable

1) Par défaut, les nouvelles variables définies ne sont valides que dans l'environnement Shell actuel, elles sont donc appelées variables locales. Lors de la saisie d'un sous-programme ou d'un nouvel environnement de sous-shell, les variables locales ne peuvent plus être utilisées.

2) Les variables spécifiées peuvent être exportées en tant que variables globales via l'exportation de commande interne, de sorte que les variables définies par l'utilisateur puissent continuer à être utilisées dans tous les environnements de sous-shell.

  • Définissez l'expression de portée de la variable:
格式1:export 变量名
格式2:export 变量名=变量值

Vous pouvez utiliser la commande pstree pour afficher l'environnement Shell, entrez la commande bash pour entrer dans l'environnement sous-Shell, appuyez sur la combinaison de touches Ctrl + D ou entrez la commande exit pour quitter l'environnement sous-Shell.

Insérez la description de l'image ici

Entrez bash pour accéder à l'environnement sous-bash (également appelé environnement sous-Shell), ce qui équivaut à ouvrir un sous-processus.

Insérez la description de l'image ici

Après avoir attribué une valeur à PRODUCT dans l'environnement bash parent actuel, je suis entré dans le sous-environnement et j'ai constaté que la valeur de la variable PRODUCT ne pouvait pas être affichée dans le sous-environnement car PRODUCT n'est pas une variable d'environnement globale, et le PRODUIT dans le le sous-environnement n'a pas été attribué. Après avoir généré PRODUCT en tant que variable d'environnement globale, vous pouvez toujours afficher la valeur de la variable d'environnement parent PRODUCT même si vous entrez dans l'environnement Shell enfant.

Insérez la description de l'image ici

7. Fonctionnement des variables entières

  • Expression d'opération
格式:expr 变量1 运算符 变量2 [运算符 变量3]
  • Opérateurs communs

Addition +, soustraction -, multiplication \ *, division /, prenez le% restant.

Expressions arithmétiques couramment utilisées:

a=`expr 11 \* 2`
echo $((10 / (1+1)))
echo $[10 / (1+1)]
let i=12*4

i++ 相当于 i=$[$i+1]
i-- 相当于 i=$[$i-1]
i+=2 相当于 i=$[$i+2]

Insérez la description de l'image ici

Six, variables shell spéciales

1. Variables d'environnement

Créé à l'avance par le système pour définir l'environnement de travail de l'utilisateur.
Fichiers de configuration: / etc / profile (globalement efficace), ~ / .bash_profile (environnement utilisateur actuel)

2. Variables d'environnement communes

PWD 、
UTILISATEUR DE CHEMIN 、 SHELL 、 ACCUEIL

Utilisez la commande env pour afficher les variables d'environnement dans l'environnement de travail actuel. La
variable USER représente le nom de l'utilisateur, HOME représente le répertoire de base de l'utilisateur, LANG représente la langue et le jeu de caractères, PWD représente le répertoire de travail actuel et la variable PATH représente la recherche par défaut des programmes exécutables. path

3.PATH (variable d'environnement de chemin)

echo $PATH					#查看当前搜索路径
PATH="$PATH:/root"			#将/root目录添加到搜索路径
export PATH="$PATH:/root"	#输出为全局环境变量
first.sh

Insérez la description de l'image ici

Le passage à l'environnement sous-shell est toujours exécutable et les autres répertoires sont toujours exécutables

Insérez la description de l'image ici

4. Variables en lecture seule

Utilisé lorsque la valeur de la variable ne peut pas être modifiée

readonly 命令设置只读变量
readonly PRODUCT				#设置为只读变量
echo $PRODUCT
PRODUCT=Python			        #只读变量不可以被重新赋值
unset PRODUCT					#只读变量不可以被删除,unset 命令用于删除变量,但无法删除只读变量,只能重启系统解决

Insérez la description de l'image ici

5. Variables de localisation

Exécutez le script sh xxx.sh 1 2 3 4 5 6 7 8 9 10… n

$ n: n est un nombre, $ 0 représente la commande elle-même, 1 ~ 9 représentent le premier au neuvième paramètres, les paramètres supérieurs à dix doivent être exprimés entre accolades, par exemple, le dixième paramètre est $ {10}

Insérez la description de l'image ici

6. Variables prédéfinies

$*、$@:表示命令或脚本要处理的参数。
  $*:把所有参数看成以空格分隔的一个字符串整体,代表"$1 $2 $3 $4"。
  $@:把各个参数加上双引号分隔成n份的参数列表,每个参数是独立  的,代表"$1" "$2" "$3" "$4"。

$0:表示当前执行的脚本或命令的名称。
$#:表示命令或脚本要处理的参数的个数。	
$?:表示前一条命令或脚本执行后的返回状态码,返回值为0表示执行正确,返回任何非0值均表示执行出现异常。
也常被用于Shell脚本中return退出函数并返回的退出值。
[root@localhost ~]#echo `date +%F` #查看完整日期,按照年-月-日的格式输出
2020-12-20
[root@localhost ~]#vim mybak.sh #编辑脚本
#!/bin/bash            #表示此行以后的语句通过/bin/bash程序来解释执行
time=backup-`date +%F`.tar.gz #把变量值backup-`date+%F`.tar.gz赋值给变量time
tar zcf $time $* &> /dev/null	#/dev/null表示的是一个黑洞文件,通常用于丢弃不需要的数据输出。
echo "已执行 $0 脚本,"
echo "共完成 $# 个对象的备份"
echo "具体内容包括: $*"

[root@localhost ~]#chmod +x mybak.sh #赋予执行权限
[root@localhost ~]#./mybak.sh /etc/passwd /etc/shadow

Insérez la description de l'image ici

Je suppose que tu aimes

Origine blog.csdn.net/qq_35456705/article/details/111873256
conseillé
Classement