0

0

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

PHPz

PHPz

发布时间:2023-06-27 12:51:02

|

1419人浏览过

|

来源于51CTO.COM

转载

在不同的shell中,使用’!’符号的大多数linux命令用法可能会有所不同。虽然我提供的示例通常在bash shell中使用,但其他一些linux shell可能具有不同的实现,或者可能根本不支持某些对’!’符号的使用。

让我们深入了解Linux命令中’!’符号的令人惊奇和神秘的用法。

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

1、使用命令编号从历史记录中运行命令

一个有用的提示是,你可以从之前执行过的命令中找到历史命令并再次运行。首先,通过运行’history’命令找到命令的编号。

linuxmi@linuxmi:~/www.linuxmi.com$ history

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

在Linux中查找最近执行的命令

要通过命令编号从历史记录中运行命令,可以使用’!’符号后跟命令编号,如下所示。

$ !58

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

按命令编号运行命令

当你执行上述命令时,它将运行历史记录中第58行的命令。

请注意,实际的命令编号可能因你的命令历史而有所不同。你可以使用history命令查看命令列表及其行号。

2、在Linux中运行先前执行的命令

你可以通过命令的运行顺序来运行先前运行过的命令,最后运行的命令将表示为-1,倒数第二个为-2,倒数第七个为-7,依此类推。你可以使用!-n,其中n是你要引用的命令的倒数编号。如下图

$ history$ !-3$ !-6$ !-10

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

在Linux中重新运行命令

3、将先前命令的参数传递给新命令

我需要列出目录’/home/linuxmi/snap’的内容,所以我执行了以下命令:

$ ls /home/linuxmi/snap

接着我意识到,应该运行"ls -l"命令以查看哪些文件可执行。不必重新输入整个命令,只需传递上个命令的参数给这个新命令即可,如下所示:

$ ls -l !$

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

在这里,’!$’将上个命令中传递的参数传递给这个新命令。

4、如何处理命令中的两个或多个参数

假设我在桌面上创建了一个名为1.txt的文本文件。

linuxmi@linuxmi ~/www.linuxmi.com% touch /home/linuxmi/linuxmi.go

然后使用完整路径将其复制到’/home/avi/Downloads’目录中,使用cp命令。

linuxmi@linuxmi ~/www.linuxmi.com% cp /home/linuxmi/linuxmi.go /home/linuxmi/go

现在我们在cp命令中传递了两个参数。第一个是’/home/avi/Desktop/1.txt’,第二个是’/home/avi/Downloads’。我们可以通过执行echo命令,并使用不同的参数,以不同的方式打印两个参数。

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

请注意,第一个参数可显示为“!^”,而其它参数可通过执行“![命令名称]:[参数编号]”进行打印。

在上面的示例中,第一个命令是’cp’,需要打印第二个参数。因此是”!cp:2″。对于具有5个参数的xyz命令,如果需要获取第4个参数,可以使用“!xyz:4”,并根据需要使用该参数。可以通过”!*”访问所有的参数。

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

处理两个或多个参数

5、根据特定关键词运行最近的命令

我们可以根据关键词执行最近执行的命令。具体如下所示:

$ 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]

这里我们使用了ls命令,但使用了不同的选项和不同的文件夹。另外,为了保持控制台的清洁,我们会将每个命令的输出发送到“/dev/null”。

海螺语音
海螺语音

海螺AI推出的AI语音生成工具,支持多种语种、情绪和效果。

下载

现在根据关键词执行最后执行的命令:

$ ! ls			[Command 1]$ ! ls -l		[Command 2]	$ ! ls -la		[Command 3]$ ! ls -lA		[Command 4]

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/

然后突然我发现我需要将上述脚本的输出重定向到一个名为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

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

ifconfig | grep "inet addr:" | awk '{print $2}' | grep -v '127.0.0.1' | cut -f2 -d:

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

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

su -c “!!” root

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

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

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

$ rm !(important_file.txt)

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

$ $ rm !(*.pdf)

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'

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

$ [ ! -d /home/linuxmi/linuxmi.com] && exit

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

[ ! -d /home/linuxmi/linuxmi.com] && mkdir /home/linuxmi/linuxmi.com

相关文章

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

226

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

428

2024.03.01

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

1343

2023.06.21

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

698

2023.06.29

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

292

2023.06.30

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

771

2023.07.05

linux系统安装教程
linux系统安装教程

linux系统是一种可以免费使用,自由传播,多用户、多任务、多线程、多CPU的操作系统。本专题提供linux系统安装教程相关的文章,大家可以免费体验。

571

2023.07.06

linux删除文件夹的方法
linux删除文件夹的方法

linux删除文件夹的方法:1、使用rm -r命令;2、使用rm -rf命令;3、使用find命令结合rm命令;4、使用图形界面。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

969

2024.02.23

苹果官网入口直接访问
苹果官网入口直接访问

苹果官网直接访问入口是https://www.apple.com/cn/,该页面具备0.8秒首屏渲染、HTTP/3与Brotli加速、WebP+AVIF双格式图片、免登录浏览全参数等特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

6

2025.12.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 5.9万人学习

Git 教程
Git 教程

共21课时 | 2.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号