linux命令行的操作符,Linux命令行下”!”的用法

Linux 系统中,“!” 符号或者操作符通常被用做逻辑否定的操作符,同时也通过一些调整和改动命令来从历史记录中找出你需要的命令行。下面演示的命令行在bash Shell中都已经明确检查过可用了。不过我没有在其他的 Shell 解释器下测试过,不过我相信这些命令也不会在其他的解释器下运行。那么现在就让我们学习一下 “!” 这神奇而独特的用法吧!

1.从历史记录中使用命令号来运行命令

你也许从没意识到过可以从命令行历史记录(之前执行过的命令)里执行一条命令,首先输入 “history” 命令得到命令的序号。

7bff2f2b9d5586a93776cf7ef54b0909.png

b8d1a77087d7766806abc4d1a729c593.gif

这时你可以通过命令 history 的输出中的命令序号来执行一条命令。

c2e7d2fd17c871dec964466a262288bb.png

98227ec46ab0ec0998ad1f70bbc87760.gif

上面可以看到它执行了号码为1551的 top 命令,这种执行方式对执行某些特别长的命令非常有用,你只要使用”!”符号加上命令的序号就能执行该命令啦。

2.执行指定的之前执行过的命令

你可以运行 !-1、!-2 或者 !-7 等命令来执行你记录序列中的倒数第一条命令、倒数第二条命令已经倒数第七条等等。。。和上面的方式一样,你需要先用 history 命令来列出命令列表。其实这个命令非常有用,你可以通过它来确定没有执行过某些错误命令比如 “rm command >file” 或者别的危险指令。这里给出了执行倒数第六个、第八个和第十个命令的效果。

df43fa8484b0682869fc6b7989420ec9.png

389d10d1083f9418aaae919b96a804d1.gif

3.向一条新命令传递旧命令的参数避免重复输入

比如说我需要列出 ‘/home/$USER/Binary/firefox’ 这个目录。

8927f76bdeb26bd68c1db8dee720ab44.png

但是这个时候我又想用 “ls-l“查看这个目录下的具体信息,那么我需要重新输入上面的命令吗?当然不需要,你只要用下面这个命令:

2d16006dbed9eadc5cd5f24eb479186e.png

“!$” 符号可以将上一条命令的参数传递给下一条命令参数:

53f4e6b7473b0c19b672c128caf3138a.gif

4.如何用(!)处理两个以上的参数?例如我在桌面上创建了一个 1.txt 文件

4363dcf8f8847e331bd444ac2cde5729.png

然后使用CP命令把它复制到 ‘home/avi/Downloads’ 目录

54c87102b135a32bb8bf41f9295e8224.png

这样我们就向CP命令传递了两个参数。第一个是 ‘/home/avi/Desktop/1.txt’ ,第二个是’/home/avi/Downloads’,为了区分它们,我们 使用 echo 来打印每个参数。

b4e115f6c8f8eb8f63dfaf98dcde620b.png

可以注意到第一个参数可以使用 “!^” 来表示,剩下的参数就可以使用 “命令名:参数序号”这种方式来表示,比如 “!cp:2″。再举个例子,如果你执行的某个命令为 “xyz”,命令 后面有5个参数而你想调用第四个参数,就可以使用 “!xyz:4″ 来调用它。当然,你可以使用 “!* “ 来表示所有参数。

8bc0e5cba12f72ddc377f0f12b2b866f.gif

5.通过关键词来执行之前的命令

我们可以通过执行关键词来执行之前的命令。可以按照下面的命令来理解:

d9bca9340a081ad3e9b2331e2c80f1e9.png

上面是相同的ls命令对应了不同参数和文件夹。此外我们将每一个标准输出都传递到了 ‘/dev/null’ 因为我们并不希望处理程序的标准输出。现在我们可以调用命令的关键词来实现它们。

ac6ca407a5a3fae76c784b15cc4b7aab.png

当你使用 “ls” 关键词来执行之前命令的时候,你一定会被标准输出给惊讶到。

9ff4cc0ccd70591df92cfd870adb1222.gif

6.非常实用的 !! 操作符

你可以使用(!!)来运行或者改变之前的命令。它会调用最近使用的命令来调整当前命令,给大家展示一下使用场景。

昨天我运行了一个获取IP的Shell命令:

493dca5f9f7980105a46084e4c52c1c7.png

突然我意识到需要将结果重定向到 ip.txt 中,这时你应该想到用 “UP” 键恢复上一个命令再加上 ‘>ip.txt‘ 命令来重定向进去:

e8fda9431f0862896024817704f64dde.png

感谢这次救命的”UP” 键。那么再考虑下这个场景,如果我需要运行下面的这个脚本:

bb9179630941922d69278e02cedc5a2d.png

当我运行它的时候突然报出了”bash:ifconfig:command not found”错误,我意识到可能是我设定了这个命令需要root权限来运行它。那么现在怎么办?需要重新登录root账号来执行它么?这种情况下使用”up”键也并不管用。所以这里我们使用 “!!” 命令来选择调用这条命令。

afe170ee2937194cdff2d1c997789b59.png

显而易见的是 su 是用来选择执行用户的, -c 是用来表示执行具体命令的,最重要的部分 “!!” 代替了你最后一次运行的命令。然后输入你的root密码即可运行它了。

554ce7c9908c76a2226bdc2a610f5af1.gif

我相信下面的场景非常适合 “!!”  的使用。

当你使用普通的账户来执行 apt-get 的时候,常常会报错提示你没有权限执行。

63456d6e439939f904d07194b76095ca.png

哈哈不用担心,这时候就可以使用下面的命令来成功执行了:

603594285d91d4d6b6e717c3a2e72e8b.png

同样有类似的场景:如果普通用户没有权限,即可这样运行:

ae4d988d3b5d8cb528c5eb903bb8733f.png

7.使用 !(文件名) 的方式来避免命令对某个文件的影响

这里的 “!” 符号相当于逻辑否定来使用,用来避免对加了 “!” 前缀的文件产生影响。

A.从目录中删除除 2.txt 外的所有文件:

236e1efb4a28a0f416fb285b14644a1d.png

B.从目录中删除以 pdf 为后缀的文件:

69c0429b4d6c606d68021608f12f0dbd.png

8.检查某个目录是否存在,如果存在就将其打印

这里使用 ‘! -d’  命令来判断目录是否为空,同时使用 “&&” 和 “||” 命令来打印判断目录是否存在:

4715d9ad364a3bf6ca437d05d58f776b.png

9.检测目录是否是否为空,如果为空则退出

和上面的命令类似。这里是检测目录是否为空,如果为空则退出命令

770726324243c32f51244ad568bbe8b2.png

10.检测目录是否为空,如果为空则在 home 目录中重新创建目录

1999488a3e1fe2c1c23bb660ea976cd9.png

来源:www.linuxstory.org

作者:Here or There

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值