Maison > Opération et maintenance > Nginx > Huit utilisations mystérieuses de l'opérateur '!' dans les commandes Linux

Huit utilisations mystérieuses de l'opérateur '!' dans les commandes Linux

PHPz
Libérer: 2023-06-27 12:51:02
avant
1290 Les gens l'ont consulté

L'utilisation de la plupart des commandes Linux utilisant le symbole « ! » peut varier selon les shells. Bien que les exemples que je fournis soient généralement utilisés dans les shells bash, certains autres shells Linux peuvent avoir des implémentations différentes ou ne pas prendre en charge certaines utilisations du symbole « ! »

Plongeons dans les utilisations surprenantes et mystérieuses du symbole « ! » dans les commandes Linux.

Linux 命令中“!”操作符的八个神秘用途

1. Exécutez les commandes de l'historique en utilisant le numéro de commande

Un conseil utile est que vous pouvez rechercher des commandes historiques à partir de commandes précédemment exécutées et les exécuter à nouveau. Tout d’abord, recherchez le numéro de la commande en exécutant la commande « history ».

linuxmi@linuxmi:~/www.linuxmi.com$ history
Copier après la connexion

Linux 命令中“!”操作符的八个神秘用途

Rechercher les commandes récemment exécutées sous Linux

Pour exécuter une commande depuis l'historique par numéro de commande, vous pouvez utiliser le symbole « ! » suivi du numéro de commande comme indiqué ci-dessous.

$ !58
Copier après la connexion

Linux 命令中“!”操作符的八个神秘用途

Exécuter la commande par numéro de commande

Lorsque vous exécutez la commande ci-dessus, elle exécutera la commande à la ligne 58 de l'historique.

Veuillez noter que le numéro de commande réel peut varier en fonction de votre historique de commandes. Vous pouvez utiliser la commande history pour afficher une liste de commandes et leurs numéros de ligne.

2. Exécutez les commandes précédemment exécutées sous Linux

Vous pouvez exécuter les commandes précédemment exécutées dans l'ordre dans lequel elles sont exécutées. La dernière commande exécutée sera représentée par -1, l'avant-dernière par -2 et la. du dernier au dernier. Le septième est -7, et ainsi de suite. Vous pouvez utiliser !-n, où n est le numéro réciproque de la commande que vous souhaitez citer. Comme indiqué ci-dessous

$ history$ !-3$ !-6$ !-10
Copier après la connexion

Linux 命令中“!”操作符的八个神秘用途

Réexécutez la commande sous Linux

3. Transmettez les paramètres de la commande précédente à la nouvelle commande

Je dois lister le contenu du répertoire '/home/linuxmi/snap'. , donc j'exécute, j'ai exécuté la commande suivante :

$ ls /home/linuxmi/snap
Copier après la connexion

Puis j'ai réalisé que je devais exécuter la commande "ls -l" pour voir quels fichiers étaient exécutables. Au lieu de retaper l'intégralité de la commande, passez simplement les paramètres passés dans la commande précédente à cette nouvelle commande, comme ceci :

$ ls -l !$
Copier après la connexion

Linux 命令中“!”操作符的八个神秘用途

Ici, '!$' passe les paramètres passés dans la commande précédente à cette nouvelle commande.

4. Comment gérer deux paramètres ou plus dans la commande

Supposons que je crée un fichier texte nommé 1.txt sur le bureau.

linuxmi@linuxmi ~/www.linuxmi.com% touch /home/linuxmi/linuxmi.go
Copier après la connexion

Copiez-le ensuite dans le répertoire '/home/avi/Downloads' à l'aide de la commande cp en utilisant le chemin complet.

linuxmi@linuxmi ~/www.linuxmi.com% cp /home/linuxmi/linuxmi.go /home/linuxmi/go
Copier après la connexion

Maintenant, nous passons deux paramètres dans la commande cp. Le premier est « /home/avi/Desktop/1.txt » et le second est « /home/avi/Downloads ». Nous pouvons imprimer deux paramètres de différentes manières en exécutant la commande echo et en utilisant des paramètres différents.

linuxmi@linuxmi ~/www.linuxmi.com% echo "第一个参数是:!^"echo "第一个参数是:/home/linuxmi/linuxmi.go"第一个参数是:/home/linuxmi/linuxmi.golinuxmi@linuxmi ~/www.linuxmi.com% echo "第二个参数是:!cp:2"echo "第二个参数是:/home/linuxmi/go"第二个参数是:/home/linuxmi/go
Copier après la connexion

Veuillez noter que le premier paramètre peut être affiché sous la forme "!^", tandis que les autres paramètres peuvent être imprimés en exécutant "![Nom de la commande]:[Numéro du paramètre]".

Dans l'exemple ci-dessus, la première commande est 'cp' et le deuxième paramètre doit être imprimé. D'où "!cp:2". Pour la commande xyz avec 5 paramètres, si vous avez besoin d'obtenir le 4ème paramètre, vous pouvez utiliser "!xyz:4" et utiliser ce paramètre selon vos besoins. Tous les paramètres sont accessibles via "!*".

Linux 命令中“!”操作符的八个神秘用途

Traitement de deux paramètres ou plus

5. Exécuter des commandes récentes basées sur des mots-clés spécifiques

Nous pouvons exécuter des commandes récemment exécutées en fonction de mots-clés. Les détails sont les suivants :

$ ls /home > /dev/null				[Command 1]$ ls -l /home/linuxmi/linuxmi > /dev/null		[Command 2]	$ ls -la /home/linuxmi/linuxmi.com > /dev/null	[Command 3]$ ls -lA /usr/bin > /dev/null			[Command 4]
Copier après la connexion

Ici, nous avons utilisé la commande ls, mais avec des options et des dossiers différents. De plus, pour garder la console propre, nous enverrons la sortie de chaque commande à "/dev/null".

Exécutez maintenant la dernière commande exécutée en fonction du mot-clé :

$ ! ls			[Command 1]$ ! ls -l		[Command 2]	$ ! ls -la		[Command 3]$ ! ls -lA		[Command 4]
Copier après la connexion

Linux 命令中“!”操作符的八个神秘用途

检查输出,你会惊讶地发现你正在运行已经执行过的命令,只是使用了ls关键词。

6、在Linux中重复上次执行的命令

你可以使用(!!)操作符来运行/修改你上次执行的命令,这是一个简写符号,允许你引用在命令行中执行的上一个命令。

例如,我运行了一个单行脚本来查找Linux机器的IP地址:

$ ip addr show | grep inet | grep -v 'inet6'| grep -v '127.0.0.1' | awk '{print $2}' | cut -f1 -d/
Copier après la connexion

然后突然我发现我需要将上述脚本的输出重定向到一个名为ip.txt的文件中,那么我该怎么办呢?我需要重新输入整个命令并将输出重定向到文件吗?好吧,一个简单的解决方案是使用上箭头键来调出上一条命令,并在末尾添加’> ip.txt’来将输出重定向到文件。

$ ip addr show | grep inet | grep -v 'inet6'| grep -v '127.0.0.1' | awk '{print $2}' | cut -f1 -d/ > ip.txt
Copier après la connexion

感谢上箭头键的救命作用。现在考虑以下情况,下次我运行下面的单行脚本。

ifconfig | grep "inet addr:" | awk '{print $2}' | grep -v '127.0.0.1' | cut -f2 -d:
Copier après la connexion

当我运行脚本时,bash提示返回了一个错误,信息为“bash: ifconfig: command not found”,我很容易猜到我以一个普通用户的身份运行了这个命令,而它应该以root身份运行。

那么解决办法是什么呢?登录为root然后重新输入整个命令是很困难的!在上一个示例中的(上箭头键)在这里也无法帮助。所以,要调用用户的最后一个命令,需要输入“!!”(不需要引号)

su -c “!!” root
Copier après la connexion

这里的su是切换用户的命令,root是要切换到的用户,-c是以指定的用户身份运行命令的选项,最重要的部分是!!将被替换为上次运行的命令。是的!你需要提供root密码。

7、使用’!’操作符删除除一个文件之外的所有文件

在Linux中,’!’操作符(也称为”bang”操作符)用于历史扩展,它允许你引用先前的命令并对其执行各种操作。要从目录中删除除了特定文件(important_file.txt)之外的所有文件,可以使用带有’!’操作符的rm命令,如下所示。

$ rm !(important_file.txt)
Copier après la connexion

要从文件夹中删除除了扩展名为’.pdf’之外的所有文件类型。

$ $ rm !(*.pdf)
Copier après la connexion

8、检查Linux中的目录是否存在

在这里,我们将使用’! -d’来验证目录是否存在,如果目录不存在,则紧随其后的是逻辑与操作符(&&),打印出目录不存在,如果目录存在,则紧随其后的是逻辑或操作符(||),打印出目录存在。

逻辑是,当[ ! -d /home/linuxmi/linuxmi.com ]的输出为0时,它将执行逻辑与之后的内容,否则它将转到逻辑或(||)并执行逻辑或之后的内容。

$ [ ! -d /home/linuxmi/linuxmi.com ] && printf '\nno such /home/linuxmi/linuxmi.com directory exist\n' || printf '\n/home/linuxmi/linuxmi.com directory exist\n'
Copier après la connexion

类似于上面的条件,但是如果所需目录不存在,它将退出命令。

$ [ ! -d /home/linuxmi/linuxmi.com] && exit
Copier après la connexion

在脚本语言中的一般实现,如果所需目录不存在,它将创建一个目录。

[ ! -d /home/linuxmi/linuxmi.com] && mkdir /home/linuxmi/linuxmi.com
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:51cto.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal